컴파일 된 라이브러리에 대해 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 ...) }
는
을 /home/install/x86_64/lib/libquicknet3.a하기3210그래서 왜 trapper.cpp 호출이이 생성자 정의에 대한 참조를 찾을 수 없는지 이해할 수 없습니다. -L/home/install/x86_64/lib -lquicknet3
의 g ++ 인수가 트릭을 수행해야합니다. 맞습니까?
아이디어가 있으십니까?
덕분에, 로이
이것은 작동합니다. 그러나 왜?"-L/home/n4739094/install/x86_64/lib -lquicknet3"은 /home/n4739094/install/x86_64/lib/libquicknet3.a와 정확히 같은 효과가 있습니까? -v를 사용해 보았지만 "검색 경로"에 대한 어떤 의미도 만들 수 없었습니다 - 어떤 힌트입니까? 감사합니다 :) –
-lquicknet을 사용하면 링커가 홈 디렉토리를 포함하는 라이브러리 경로에서 libquicknet3.a를 검색한다고 말합니다. 링커가 다른 경로에서 사본을 사용하고 있습니다. 불행히도 gcc 문서가 필요하지 않습니다. 검색 순서가 뭔지 말해줘. – Ismael
-v 옵션을 사용하면 LIBRARY_PATH 및 collect2 호출을 살펴 봐야합니다. 'g ++ ... 2> & 1 | egrep 'collect2 | LIBRARY_PATH'' – Ismael