g ++未定义的构造函数引用

时间:2009-03-13 10:18:45

标签: c++ constructor linker g++ undefined-reference

我正在编译和链接cpp文件与预编译的库,我收到一个“未定义的引用”错误。

首先,这是命令(有问题的库是quicknet3,我编译的程序是捕获器):

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);

其中fpFILE *,预先指定为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的调用无法找到对此构造函数定义的引用。 -L/home/install/x86_64/lib -lquicknet3的g ++参数应该可以解决问题吧?

有什么想法吗?

谢谢, 罗伊

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

你可以尝试:

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

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

(如果你感兴趣的话,FILE在stdio.h中定义,libio.h中的_IO_FILE定义)

答案 2 :(得分:1)

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

我想进一步研究,如果g ++正在选择另一个libquicknet3副本,你可以将-v传递给g ++,这样它就会输出它的搜索路径。