[완료] 컴파일 에러입니다.
글쓴이: 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로 대체하니까 되긴 되는데, 또 에러 발생합니다. 파도가 하나 지나갔다 싶으면 또 하나가 밀려오네요 하하 :)
댓글 달기