1

我正在针对预编译的库编译和链接 cpp 文件,并且收到“未定义的引用”错误。

首先,这是命令(有问题的库是 quicknet3,我正在编译的程序是 trapper):

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

这是未定义的参考错误:

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

trapper.cpp(第 1731 行)中的调用是:

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

其中fpa 是预先FILE *分配为调用的结果。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

所以,我不明白为什么来自 trapper.cpp 的调用无法找到对这个构造函数定义的引用。的 g++ 参数-L/home/install/x86_64/lib -lquicknet3应该可以解决问题,对吧?

有任何想法吗?

谢谢,罗伊

4

3 回答 3

3

我注意到你正在混合FILE*_IO_FILE*. 我对后者不熟悉,你确定它们是同一个人吗?

于 2009-03-13T10:30:16.517 回答
1

FILE 是_IO_FILE. 您的链接器将其视为唯一类型。

你可以试试:

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

看看这是否解决了您的构造函数。

(FILE 在 stdio.h 中定义,如果您有兴趣,_IO_FILE 在 libio.h 中定义)

于 2009-03-13T12:23:05.230 回答
1

一个快速的解决方法是将 /home/install/x86_64/lib/libquicknet3.a 添加到 g++ 命令行。

我想进一步调查,如果 g++ 正在选择 libquicknet3 的另一个副本,您可以将 -v 传递给 g++,以便它输出其搜索路径。

于 2009-03-13T13:02:21.020 回答