2009-03-13 8 views
1

컴파일 된 라이브러리에 대해 cpp 파일을 컴파일하고 연결하고 "정의되지 않은 참조"오류가 발생합니다.g ++ 정의되지 않은 생성자에 대한 참조

/tmp/ccFuVczF.o: In function 'main': trapper.cpp:1731: undefined reference to 'QN_InFtrLabStream_PFile::QN_InFtrLabStream_PFile(int, char const*, _IO_FILE*, int)'

: 여기 g++ -w -g -I. -g -O3 -pipe -Wall -I/home/install/x86_64/include/quicknet3 -L/home/install/x86_64/lib -lquicknet3 -lintvec -lfltvec -o trapper trapper.cpp CMyException.cpp

가 정의되지 않은 참조 오류입니다 :

첫째,이 명령 (문제의 라이브러리 quicknet3, 내가 컴파일하고있어 프로그램이 사냥꾼이)입니다

trapper.cpp (1731 행)의 호출은 다음과 같습니다.

IN_PFILE = new QN_InFtrLabStream_PFile(0, "", fp, 1);

여기에서 fp은 이고 미리 fopen 전화로 결과로 지정됩니다.

다음과 같이 해당 헤더 파일 (QN_Pfile.h)에 정의 된 호출되는 생성자 :

class QN_InFtrLabStream_PFile : public QN_InFtrLabStream
{
public:
QN_InFtrLabStream_PFile(int a_debug, const char* a_dbgname, FILE* a_file, int a_indexed);
(... other declarations ...) }

생성자의 정의가 실제로 QN_Pfile.cc 주어진다 :

QN_InFtrLabStream_PFile::QN_InFtrLabStream_PFile(int a_debug,const char* a_dbgname, FILE* a_file, int a_indexed) : log(a_debug, "QN_InFtrLabStream_PFile", a_dbgname),file(a_file),indexed(a_indexed),buffer(NULL),sentind(NULL) {
(... the usual constructor stuff :P ...) }

나는 오류없이 quicknet3 라이브러리 나 자신을 컴파일하고 설치

을 /home/install/x86_64/lib/libquicknet3.a하기3210

그래서 왜 trapper.cpp 호출이이 생성자 정의에 대한 참조를 찾을 수 없는지 이해할 수 없습니다. -L/home/install/x86_64/lib -lquicknet3의 g ++ 인수가 트릭을 수행해야합니다. 맞습니까?

아이디어가 있으십니까?

덕분에, 로이

답변

1

빠른 해결 방법은 g ++ 명령 행에 /home/install/x86_64/lib/libquicknet3.a을 추가하는 것입니다 (당신이 관심이 있다면 파일은 libio.h에 _IO_FILE, STDIO.H에 정의되어 있습니다).

g ++에서 libquicknet3의 다른 복사본을 선택하면 -v를 g ++로 전달하여 검색 경로를 출력 할 수 있습니다.

+0

이것은 작동합니다. 그러나 왜?"-L/home/n4739094/install/x86_64/lib -lquicknet3"은 /home/n4739094/install/x86_64/lib/libquicknet3.a와 정확히 같은 효과가 있습니까? -v를 사용해 보았지만 "검색 경로"에 대한 어떤 의미도 만들 수 없었습니다 - 어떤 힌트입니까? 감사합니다 :) –

+0

-lquicknet을 사용하면 링커가 홈 디렉토리를 포함하는 라이브러리 경로에서 libquicknet3.a를 검색한다고 말합니다. 링커가 다른 경로에서 사본을 사용하고 있습니다. 불행히도 gcc 문서가 필요하지 않습니다. 검색 순서가 뭔지 말해줘. – Ismael

+0

-v 옵션을 사용하면 LIBRARY_PATH 및 collect2 호출을 살펴 봐야합니다. 'g ++ ... 2> & 1 | egrep 'collect2 | LIBRARY_PATH'' – Ismael

3

난 당신이 FILE*_IO_FILE*을 혼합하고 있음을 알 수 있습니다. 나는 후자에 익숙하지 않다, 당신은 그들이 동일하고 확실한가요?

+0

실제로 문제는 아니지만 오류 메시지가 "no matching function for call ..."과 같지 않습니까? 어쨌든, Aaron의 제안은 작동하지 않았습니다. (FILE *로 변환) –

1

FILE은 _IO_FILE의 typedef입니다. 귀하의 링커는 그것을 독특한 유형으로 취급하고 있습니다.

당신이 시도 할 수 :이 생성자를 해결하는 경우

IN_PFILE = new QN_InFtrLabStream_PFile(0, "", (FILE *)fp, 1); 

확인합니다.

+0

안녕하세요, Aaron, 고맙습니다.하지만이 방법을 시도했지만 작동하지 않았습니다. –