对现有函数的未定义引用
Undefined Reference to Existing Function
好吧,我正在开发一个小型网络库,用于我的另一个应用程序。我在NetStream.h中声明了一个函数,如下所示:
class NetStream;
class NetStream {
public:
static NetStream *connect(char *ip, char *port, char** error);
...
}
在我的NetStream.cpp中,我用相同的原型定义了它:
NetStream* NetStream::connect(char *ip, char *port, char** error) {
...
}
当我objdump我的libNetLib.a时,我可以看到NetStream::connect被定义为:
$ objdump -Ct NetLib/libNetLib.a | grep 'connect' #demangled names
000000000000031a g F .text 00000000000001b4 NetStream::connect(char*, char*, char**)
0000000000000000 *UND* 0000000000000000 connect
$ objdump -t NetLib/libNetLib.a | grep 'connect' #mangled names
000000000000031a g F .text 00000000000001b4 _ZN9NetStream7connectEPcS0_PS0
0000000000000000 *UND* 0000000000000000 connect
在使用我的NetLib的应用程序中的对象文件中,objdump显示它正在导入一个具有相同原型的函数:
$ objdump -Ct connection.cpp.o | grep 'connect'
...
0000000000000000 *UND* 0000000000000000 NetStream::connect(char*, char*, char**)
...
$ objdump -t connection.cpp.o | grep 'connect'
...
0000000000000000 *UND* 0000000000000000 _ZN9NetStream7connectEPcS0_PS0_
...
但当我将应用程序与g++4.9.2
链接时,我会得到以下错误:
connection.cpp:(.text+0x52): undefined reference to `NetStream::connect(char*, char*, char**)'
当CMake尝试链接它时,以及当我用以下命令链接它时会发生这种情况:
$ g++ connection.cpp.o -L NetStream.cpp.o -o /tmp/tst
我得到了同样的未定义引用(还有一堆其他未定义引用,因为还有其他东西要链接,我没有链接到那里)。
我环顾四周,发现这通常是由于函数原型中的常量指针不同而导致的,但这里没有常量。
这里真正的问题是什么?
g++ connection.cpp.o -L NetStream.cpp.o -o /tmp/tst
这个命令行完全是假的。试试这个:
g++ connection.cpp.o -LNetLib -lNetLib -o /tmp/tst
或者这个:
g++ connection.cpp.o NetLib/libNetLib.a -o /tmp/tst
更新:
这里真正的问题是什么?
真正的问题是您的链接命令行不正确(如上所述)。
我真的不能那样编译我的代码。。。
编译不是这里的问题,链接是。
假设您无法构造正确的链接命令,因为您使用的是CMake
,而构造虚假链接命令行的是CMake
。
由于我们知道CMake
有效,我们必须假设根本原因是您的CMakefile
。很遗憾,您尚未显示您的CMakefile
。
你应该问一个单独的问题,比如:"我有下面的CMakefile
,这导致了下面的链接行,这个答案告诉我是假的。我的CMakefile
有什么问题?"
您确实需要查找g++的命令行选项的含义,因为您严重滥用了它们。
-L目录告诉链接器在路径中查找库文件。除非你有一个名为"NetStream.cpp.o"的目录(这是不太可能的),并且你在该目录中指定了要链接的库(你还没有),否则你的命令行就是胡言乱语。
您的命令行实际上是告诉链接器在目录中查找库文件,但不提供任何关于要链接的库的信息。因此,链接器甚至无法访问您的"NetLib.a"。
假设您在名为NetLib的目录(相对于调用g++时的工作目录)中有一个名为NetLib.a的库,那么正如Employed Russian所指出的那样,您要么需要执行"g++connection.cpp.o-LNetLib-LNetLib-o/tmp/tst"来链接到该库,要么执行"g++connection.cpp-o NetLib/libNetLib.a-o/tmp/t"。
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 编译时的 CImg 库返回对"__imp_SetDIBitsToDevice"的未定义引用
- 对Py_Initialize()的未定义引用
- 使用mysql c++连接器的未定义引用
- 对 Scalar ::Scalar() 的未定义引用
- 对复制 CTOR 和 CTOR 的未定义引用
- 对显式实例化的模板函数的未定义引用
- TensorRT (C++ API) 对"createNvOnnxParser_INTERNAL"的未定义引用
- 2个模板化类的非模板友元函数未定义引用错误
- 编译 libfluid 样本控制器时对"event_base_del_virtual"的未定义引用
- 获取对function_name的未定义引用
- 对 'std::thread::_M_start_thread CMake 的未定义引用进行基准测试
- 对结构方法的未定义引用
- 使用内联函数 c++ 的未定义引用
- 对 CMake 中'cudaRegisterLinkedBinary'链接错误的未定义引用?
- 对 DLOPEN 的未定义引用
- QT C++中对全局变量的未定义引用
- 快速数学导致对"__pow_finite"的未定义引用
- 对 boost::system::d etail::system_category_instance 的未定义引用,从
- OpenCV 3.4.3 中对 'cv::String::d eallocate()' 错误的未定义引用