[완료] 컴파일 에러입니다.

urere의 이미지

유닉스시스템 & 네트워크 프로그래밍(저자 신재호, 영진닷컴)이라는 책에 수록된 종합예제프로그래밍이라는 프로그램입니다. 소스에 누락된 내용을 추가하고, gcc를 사용해서 일단 컴파일이 되긴 했습니다만, Analyzer.cxx까지는 목적코드가 나오는데 그 다음 파일들이 목적코드가 생성되질 않고 에러가 발생합니다.

# make
gcc -g -I../include -c Analyzer.cxx
gcc -g -I../include -c Formatter.cxx
Formatter.cxx: In member function `void Formatter::setDate(UniqueID*)':
Formatter.cxx:58: error: `dateLock' was not declared in this scope
*** Error code 1
make: Fatal error: Command failed for target `Formatter.o'

Formmater.cxx 소스입니다.
 
 
#include "Common.h"
/***********************************************************************
 * FUNCTION : instance
 * DESCRIPTION : Formatter 객체를 반환하는 함수
 **********************************************************************/
Formatter*
Formatter::instance()
{
 // 생성된 객체가 없으면 생성 후 반환
 if(!the_formatter)
  the_formatter = new Formatter();
 
 return (the_formatter);
}
 
/***********************************************************************
 * FUNCTION : initFormatter()
 * DESCRIPTION : Unique ID 속의 Seq No를 초기화 하는 함수
 **********************************************************************/
void
Formatter::initFormatter()
{
 bscUIDSeqNo = 1;
}
 
/***********************************************************************
 * FUNCTION : setZeroUID()
 * DESCRIPTION : 비어있는 Unique ID를 만드는 함수
 **********************************************************************/
void
Formatter::setZeroUID(UniqueID *UID)
{
 strncpy(UID->date,"00000000",8);
 UID->seqNum = 0;
}
 
/***********************************************************************
 * FUNCTION : setBscUID()
 * DESCRIPTION : BSC에 보낼 메시지에서 사용할 UID 작성
 **********************************************************************/
void
Formatter::setBscUID(UniqueID *bscUID)
{
 setDate(bscUID);
 bscUID->seqNum = bscUIDSeqNo;
 bscUIDSeqNo++;
 if(bscUIDSeqNo > 268435456)
  bscUIDSeqNo = 1;
}
 
/***********************************************************************
 * FUNCTION : setDate()
 * DESCRIPTION : 오늘 날짜를 YYYYMMDD 타입으로 세팅해주는 함수
 **********************************************************************/
void
Formatter::setDate(UniqueID *UID)
{
 pthread_mutex_lock(&dateLock);
 char displayDate[8];
 time_t curtime;
 struct tm *loctime;
 static char datedt[10 + 1];
 curtime = time(NULL);
 loctime = localtime(&curtime);
 strftime(datedt, 10 + 1, "%Y%m%d", loctime);
 strncpy(UID->date,datedt,8);
 pthread_mutex_unlock(&dateLock);
}
 
/***********************************************************************
 * FUNCTION : makeHeader
 * DESCRIPTION : BSC를 위한 헤더작성. messageID, datSize는 셋팅하지 않음.
 **********************************************************************/
void
Formatter::makeHeaderToBSC(PktMsgType *pktMsg)
{
 setBscUID(&(pktMsg->hd.UID));
 
 // 디폴트인 비연속 메시지로 세팅
 pktMsg->hd.contFlag = 0x01;
 pktMsg->hd.serialNo = 0x00;
}
 
/***********************************************************************
 * FUNCTION : makePkt_connReqComCh
 * DESCRIPTION : 명령 채널에 대한 접속 요구 메시지 생성
 **********************************************************************/
void
Formatter::makePkt_connReqComCh(PktMsgType *connReqComCh)
{
 connReqComCh->hd.messageID = CommandChannelConnectionRequest;
 setZeroUID(&(connReqComCh->hd.UID));
 connReqComCh->hd.datSize = 0;
}
 
/***********************************************************************
 * FUNCTION : makePkt_connReqRltCh
 * DESCRIPTION : 결과 채널에 대한 접속 요구 메시지 생성
 **********************************************************************/
void
Formatter::makePkt_connReqRltCh(PktMsgType *connReqRltCh)
{
 connReqRltCh->hd.messageID = ResultChannelConnectionRequest;
 setZeroUID(&(connReqRltCh->hd.UID));
 connReqRltCh->hd.datSize = 0;
}
 
/***********************************************************************
 * FUNCTION : makePkt_relsReqComCh
 * DESCRIPTION : 명령 채널에 대한 접속해제 요구 메시지 생성
 **********************************************************************/
void
Formatter::makePkt_relsReqComCh(PktMsgType *relsReqComCh)
{
 relsReqComCh->hd.messageID = CommandChannelReleaseRequest;
 setZeroUID(&(relsReqComCh->hd.UID));
 relsReqComCh->hd.datSize = 0;
}
 
/***********************************************************************
 * FUNCTION : makePkt_relsReqRltCh
 * DESCRIPTION : 결과 채널에 대한 접속해제 요구 메시지 생성
 **********************************************************************/
void
Formatter::makePkt_relsReqRltCh(PktMsgType *relsReqRltCh)
{
 relsReqRltCh->hd.messageID = ResultChannelReleaseRequest;
 setZeroUID(&(relsReqRltCh->hd.UID));
 relsReqRltCh->hd.datSize = 0;
}
 
/***********************************************************************
 * FUNCTION : makePkt_stateCheck
 * DESCRIPTION : 시스템의 상태를 체크하기 위한 메시지 생성
 **********************************************************************/
void
Formatter::makePkt_stateCheck(PktMsgType *stateCheck)
{
 stateCheck->hd.messageID = StateCheckRequest;
 setZeroUID(&(stateCheck->hd.UID));
 stateCheck->hd.datSize = 0;
}
 
/***********************************************************************
 * FUNCTION : makePkt_bscCmdReq
 * DESCRIPTION : BSC에 보낼 명령 실행 요구 메시지 생성
 **********************************************************************/
void
Formatter::makePkt_bscCmdReq(PktMsgType *cmdReq, BscReqDatType bscComReq)
{
 cmdReq->hd.messageID = CommandRunRequest;
 makeHeaderToBSC(cmdReq);
 cmdReq->hd.datSize = sizeof(bscComReq);
 cmdReq->bd.u.bscReqDat = bscComReq;
}
 
/***********************************************************************
 * FUNCTION : makePkt_cmdRltAck
 * DESCRIPTION : 장비들에게 보낼 명령결과 수신 응답 메시지 생성
 **********************************************************************/
void
Formatter::makePkt_cmdRltAck(PktMsgType *cmdRltAck, UniqueID Uid, bool res)
{
 cmdRltAck->hd.messageID = CommandRunResultACK;
 cmdRltAck->hd.UID = Uid;
 cmdRltAck->hd.datSize = 4;
 
 if(res == true)
 {
  strncpy(cmdRltAck->bd.u.generalACK.result, "SC", 2);
  cmdRltAck->bd.u.generalACK.reason = 0;
 }
 else if(res == false)
 {
  strncpy(cmdRltAck->bd.u.generalACK.result, "FA", 2);
  cmdRltAck->bd.u.generalACK.reason = 1; // <= JShin Check!
 }
 else
 {
  strncpy(cmdRltAck->bd.u.generalACK.result, "SC", 2);
  cmdRltAck->bd.u.generalACK.reason = 0;
 }
}

 

Makefile 내용입니다.
COPT		= -g
 
#
#	Definitions for C compiler
#
DFLAGS		=
 
#
#	Options for loader
#
LDFLAGS		= -mt
 
#
#	Process used to print files
#
PRINT	      = pr -f
 
#
#	Name of executable image
#
PROGRAM		= tems
 
#
#	Include file locations
#
CFLAGS		= \
			  -I../include
 
#
#	Libraries needed to load image
#
LIBS		= \
			  /usr/lib/libsocket.so \
			  /usr/lib/libnsl.so.1 \
			  /usr/lib/libpthread.so.1
 
#
#	Library list used by loader, different from LIBS when shared
#	libraries are used
#
LDLIBS		= \
			  /usr/lib/libsocket.so \
			  /usr/lib/libnsl.so.1 \
			  /usr/lib/libpthread.so.1
 
SYSSHLIBS		=
 
#
#	Executable image install destination
#
DEST		= ../bin
 
#
#	Compile and load flags
#
CCFLG		= 
LDFLG		= -L /opt/TimesTen4.3/32/lib -R /opt/TimesTen4.3/32/lib
 
#
#	Flags for lint when checking program sources
#
LINTFLAGS		=
 
#
#	Command names
#
INSTALL			= sinstall
 
CC			= gcc
 
CXX			= gcc
 
LINKER			= $(PURIFY) $(CXX)
 
LEX			= lex
 
YACC			= yacc
 
ESQL			= true
 
STRIP			= strip
 
LDPOST			= true
 
EXTHDRS		=
 
HDRS			=
 
#
# Object files
#
OBJS		= Analyzer.o \
			  Formatter.o \
			  Framework.o \
			  LogHandler.o \
			  NEHandler.o \
			  Config.o \
			  BSCHandler.o \
			  UseSocket.o \
			  MsgQ.o \
 
#
# Source files
#
SRCS		= Analyzer.cxx \
			  Formatter.cxx \
			  Framework.cxx \
			  LogHandler.cxx \
			  NEHandler.cxx \
			  Config.cxx \
			  BSCHandler.cxx \
			  UseSocket.cxx \
			  MsgQ.cxx \
 
MAKEFILE	= Makefile
 
PRFILE		= .lash_print
 
SUFFIX	      = .l:sC \
		.y:sC \
		.ec:sC \
		.cxx:s+ \
		.cc:s+ \
		.nmk:sC \
		.g:sC \
		.hh:h+
 
SUFFIXES      = .c \
		.l \
		.y \
		.ec \
		.cxx \
		.cc \
		.nmk \
		.g \
		.hh
 
.SUFFIXES:	$(SUFFIXES);
 
#
#	Macros used for recursive "make" and mkmf execution
#
MAKE	      = make
 
MAKEARGS      = -f $(MAKEFILE) \
		COPT='$(COPT)' \
		DEST='$(DEST)' \
		PRINT='$(PRINT)' \
		LINKER='$(LINKER)' \
		LDFLAGS='$(LDFLAGS)'
 
MAKER         = $(MAKE) $(MAKEARGS)
 
all:		$(PROGRAM)
 
$(PROGRAM):     $(OBJS) $(LIBS)
		@echo "Loading $(PROGRAM)"
		-@rm -f $(PROGRAM)
		@$(LINKER) $(LDFLAGS) $(LDFLG) $(NEWMKLDF) $(OBJS) \
			$(LDLIBS) $(NEWMKLIB) $(SYSSHLIBS) -o $(PROGRAM)
		@$(LDPOST) $(PROGRAM)
		@echo "Done"
 
# Warning:  The NEWMKLDF and NEWMKLIB macros are added to the make command
#	    line by the newmake script. They must be not be removed from
#	    the above linker command.
 
ccopt:;		#setopt load_flags $(CFLAGS) $(DFLAGS) -DLINT
 
ccsrc:;		#setopt load_flags $(CFLAGS) $(DFLAGS) -DLINT
		#load $(SRCS)
 
ccobj:;		#load $(OBJS)
 
cclib:;		#load libc.proto $(LDLIBS)
 
clean:;		-@rm -rf $(OBJS) ptrepository Templates.DB tempinc *.I
 
depend:;	@mkmf $(MAKEARGS)
 
diff:;		@rcsdiff $(HDRS) $(SRCS)
 
index:;		@ctags -wx $(HDRS) $(SRCS)
 
#install:	$(PROGRAM)
#		@$(INSTALL) -m 555 -x $(STRIP) $(PROGRAM) $(DEST)
install:	$(PROGRAM)
			mv $(PROGRAM) $(DEST)
 
program:        $(PROGRAM)
 
lint:;		@lint $(CFLAGS) $(DFLAGS) $(LINTFLAGS) $(SRCS) \
			`lint_lib $(LIBS)`
 
print:;		@$(PRINT) $(HDRS) $(SRCS)
 
printnew:	$(PRFILE)
		@touch $(PRFILE)
 
size:;		@echo -n "Lines of code = "
		@cat $(HDRS) $(SRCS) | wc -l
 
tags:           $(HDRS) $(SRCS)
		@ctags $(HDRS) $(SRCS)
 
#	Test installed program and if out of date do make install
update:		$(DEST)/$(PROGRAM)
 
$(DEST)/$(PROGRAM): $(SRCS) $(LIBS) $(HDRS) $(EXTHDRS)
		@$(MAKER) install
 
$(HDRS) $(SRCS):; @co $@
 
$(PRFILE):	$(HDRS) $(SRCS)
		@$(PRINT) $?
 
.c.o:
	-@/bin/rm -f $@
	$(CC) $(COPT) $(CCFLG) $(CFLAGS) $(DFLAGS) -c $<
 
.cc.o:
	-@/bin/rm -f $@
	$(CXX) $(COPT) $(CCFLG) $(CFLAGS) $(DFLAGS) -c $<
 
.cxx.o:
	-@/bin/rm -f $@
	$(CXX) $(COPT) $(CCFLG) $(CFLAGS) $(DFLAGS) -c $<
 
.y.o:
	-@/bin/rm -f $@
	rm -f $*.c y.tab.c y.tab.h
	$(YACC) $(YFLAGS) -d $<
	sed -e s/yy/$*/g < y.tab.h > $*.h
	sed -e s/yy/$*/g < y.tab.c > $*.c
	rm -f y.tab.h y.tab.c
	$(CC) $(COPT) $(CCFLG) $(CFLAGS) $(DFLAGS) -c $*.c
	rm -f $*.c
 
.l.o:
	-@/bin/rm -f $@
	$(LEX) $(LFLAGS) -t $< | sed -e s/yy/$*/g > $*.c
	$(CC) $(COPT) $(CCFLG) $(CFLAGS) $(DFLAGS) -c $*.c
	rm -f $*.c
 
.ec.o:
	-@/bin/rm -f $@
	$(ESQL) $<
	$(CC) $(COPT) $(CCFLG) $(CFLAGS) $(DFLAGS) -c $*.c
	rm -f $*.c
 
.nmk.o:
	-@/bin/rm -f $@
	@./$*.nmk "$(CC)" "$(CXX)" "$(COPT)" "$(CCFLG)" "$(CFLAGS)" "$(DFLAGS)"
 
.g.o:
	-@/bin/rm -f $@
	@-touch /dev/null

세이군의 이미지

Makefile의 문제가 아니라 소스코드의 문제로 보이는데요...
Analyzer.cxx로 시작하는 모든 줄은 g++의 출력결과입니다.

#g++ -g -I../include Analyzer.cxx 를 실행하셔서 같은 내용이 출력된다면 확실하게 소스코드의 문제입니다.

urere의 이미지

소스코드에 헤더가 빠져있었네요...; 그리고 g++ 대신에 gcc로 대체하니까 되긴 되는데, 또 에러 발생합니다. 파도가 하나 지나갔다 싶으면 또 하나가 밀려오네요 하하 :)

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.