G++ 未定义对构造函数的引用

g++ undefined reference to constructor

提问人: 提问时间:3/13/2009 更新时间:3/13/2009 访问量:8458

问:

我正在编译 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);

其中 是 ,是作为事先调用的结果分配的。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

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

有什么想法吗?

谢谢 罗伊

C 构造函数 链接器 G++ 未定义引用

评论


答:

3赞 John Carter 3/13/2009 #1

我注意到你正在混合和.我不熟悉后者,你确定它们是一回事吗?FILE*_IO_FILE*

评论

0赞 3/14/2009
不是真的,但如果这是问题所在,错误消息是不是更像是“没有匹配的调用函数......”?无论如何,Aaron 的建议没有奏效(投射到 FILE*)
1赞 Aaron Saarela 3/13/2009 #2

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

您可以尝试:

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

以查看这是否能解决您的构造函数。

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

1赞 Ismael 3/13/2009 #3

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

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

评论

0赞 3/14/2009
这行得通。但是为什么??“-L/home/n4739094/install/x86_64/lib -lquicknet3”不应该与/home/n4739094/install/x86_64/lib/libquicknet3.a具有完全相同的效果吗?我尝试使用 -v,但无法理解它的“搜索路径”——有什么提示吗?谢谢:)
0赞 Ismael 3/14/2009
使用 -lquicknet 告诉链接器在库路径中搜索 libquicknet3.a,其中包括您的主目录,我的猜测是链接器正在使用另一个路径中的副本,不幸的是手头的 gcc 文档没有告诉我哪个是搜索顺序。
0赞 Ismael 3/14/2009
使用 -v 选项,您必须查看 LIBRARY_PATH 和 collect2 调用。g++ ... 2>&1 | egrep 'collect2|LIBRARY_PATH'
0赞 3/16/2009
嗨,伊斯梅尔,以下是 make 命令输出中的 collect2 行 - 如您所见,LIBRARY_PATH 未提及。此外,在用 -L 指定的所有路径中,libquicknet3.a 只能在 /home/n4739094/install/x86_64/lib 中找到。
0赞 3/16/2009
'/usr/libexec/gcc/x86_64-redhat-linux/4.3.0/collect2 --eh-frame-hdr --build-id -m elf_x86_64 --hash-style=gnu -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o trapper /usr/lib/gcc/x86_64-redhat-linux/4.3.0/../../../../lib64/crt1.o /usr/lib/gcc/x86_64-redhat-linux/4.3.0/../../../../lib64/crti.o