Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ g++;对构造函数的未定义引用_C++_Constructor_Linker_G++_Undefined Reference - Fatal编程技术网

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

C++ g++;对构造函数的未定义引用,c++,constructor,linker,g++,undefined-reference,C++,Constructor,Linker,G++,Undefined Reference,我正在编译一个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 以下是未定义的

我正在编译一个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:在函数“main”中:
trapper.cpp:1731:对“QN_inftralbstream_PFile::QN_inftralbstream_PFile(int,char const*,_IO_FILE*,int)”的未定义引用

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

IN_PFILE=new QN_inftlabstream_PFILE(0,”,fp,1)

其中
fp
是一个
文件*
,作为
fopen
调用的结果预先分配

被调用的构造函数在相关头文件(QN_Pfile.h)中定义如下:

类QN\u InFtrLabStream\u文件:公共
QN_InFtrLabStream
{
公众:
QN_InFtrLabStream_PFile(int a_debug,const char*a_dbgname,FILE*a_FILE,int a_index);
(……其他声明……) }

构造函数的定义确实在QN_Pfile.cc中给出:

QN_inftlabstream_PFile::QN_inftlabstream_PFile(int a_debug,const char*a_dbgname,FILE*a_FILE,int a_index):日志(a_debug,“QN_inftlabstream_PFile”,a_dbgname),文件(a_FILE),索引(a_index),缓冲区(NULL),sentind(NULL)
{
(…通常的构造函数:P…) }

我自己编译了quicknet3库,没有错误,并将其安装到/home/install/x86_64/lib/libquicknet3.a

因此,我无法理解为什么trapper.cpp的调用无法找到对此构造函数定义的引用。
-L/home/install/x86\u 64/lib-lquicknet3
的g++参数应该可以实现这个功能,对吗

有什么想法吗

谢谢,
Roy

我注意到您正在混合
文件*
\u IO\u文件*
。我不熟悉后者,你确定它们是同一个吗?

我注意到你把
文件*
\u IO\u文件*
混在一起了。我不熟悉后者,你确定它们是同一个吗?

文件是
\u IO\u文件的类型定义。您的链接器将其视为唯一类型

你可以试试:

IN_PFILE = new QN_InFtrLabStream_PFile(0, "", (FILE *)fp, 1);
看看这是否解决了你的构造函数


(文件在stdio.h中定义,如果您感兴趣,则在libio.h中定义)

文件是
\u IO\u文件的类型定义。您的链接器将其视为唯一类型

你可以试试:

IN_PFILE = new QN_InFtrLabStream_PFile(0, "", (FILE *)fp, 1);
看看这是否解决了你的构造函数


(文件在stdio.h中定义,_IO_文件在libio.h中定义,如果您感兴趣)

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


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

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


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

不太可能,但如果这是问题所在,错误消息是否更像是“没有匹配的调用函数…”?无论如何,Aaron的建议不起作用(强制转换为文件*),实际上不起作用,但如果这是问题所在,那么错误消息是否更像是“调用没有匹配函数…”?无论如何,亚伦的建议不起作用(铸造文件*)这是有效的。但是为什么呢??“-L/home/n4739094/install/x86_64/lib-lquicknet3”不应该与/home/n4739094/install/x86_64/lib/libquicknet3.a具有完全相同的效果吗?我试着使用-v,但无法理解它的“搜索路径”——有什么提示吗?谢谢:)使用-lquicknet告诉链接器在库路径(包括您的主目录)中搜索libquicknet3.a,我猜链接器正在另一个路径中使用副本,不幸的是,手边的gcc文档没有告诉我哪个是搜索顺序。使用-v选项,您必须查看库路径和collect2调用<代码>g++。。。2> &1 | egrep'collect2 | LIBRARY_PATH'
Hi Ismael,下面是make命令输出中的collect2行-如您所见,没有提到LIBRARY_PATH。另外,在用-L指定的所有路径中,libquicknet3.a只能在/home/n4739094/install/x86_64/lib.`/usr/libexec/gcc/x86_64-redhat-linux/4.3.0/collect2--eh frame hdr--buildid-melf_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.oThis有效。但是为什么呢??“-L/home/n4739094/install/x86_64/lib-lquicknet3”不应该与/home/n4739094/install/x86_64/lib/libquicknet3.a具有完全相同的效果吗?我试着使用-v,但无法理解它的“搜索路径”——有什么提示吗?谢谢:)使用-lquicknet告诉链接器在库路径(包括您的主目录)中搜索libquicknet3.a,我猜链接器正在另一个路径中使用副本,不幸的是,手边的gcc文档没有告诉我哪个是搜索顺序。使用-v选项,您必须查看库路径和collect2调用<代码>g++。。。2> &1 | egrep'collect2 | LIBRARY_PATH'
Hi Ismael,下面是make命令输出中的collect2行-如您所见,没有提到LIBRARY_PATH。另外,在用-L指定的所有路径中,libquicknet3.a只能在/home/n4739094/install/x86_64/lib.`/usr/libexec/gcc/x86_64-redhat-linux/4.3.0/collect2--eh frame hdr--build id-melf_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/usr/x86/gcc