[완료] 컴파일 에러입니다.
글쓴이: urere / 작성시간: 일, 2008/11/09 - 2:49오전
유닉스시스템 & 네트워크 프로그래밍(저자 신재호, 영진닷컴)이라는 책에 수록된 종합예제프로그래밍이라는 프로그램입니다. 소스에 누락된 내용을 추가하고, 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
Forums:
Makefile의 문제가
Makefile의 문제가 아니라 소스코드의 문제로 보이는데요...
Analyzer.cxx로 시작하는 모든 줄은 g++의 출력결과입니다.
#g++ -g -I../include Analyzer.cxx 를 실행하셔서 같은 내용이 출력된다면 확실하게 소스코드의 문제입니다.
감사합니다.
소스코드에 헤더가 빠져있었네요...; 그리고 g++ 대신에 gcc로 대체하니까 되긴 되는데, 또 에러 발생합니다. 파도가 하나 지나갔다 싶으면 또 하나가 밀려오네요 하하 :)
댓글 달기