Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.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++ c++;-对现有函数的未定义引用_C++_Linker - Fatal编程技术网

C++ c++;-对现有函数的未定义引用

C++ c++;-对现有函数的未定义引用,c++,linker,C++,Linker,好的,我正在开发一个小型网络库,用于我的另一个应用程序。我在NetStream.h中声明了一个函数,如下所示: class NetStream; class NetStream { public: static NetStream *connect(char *ip, char *port, char** error); ... } 在我的NetStream.cpp中,我使用相同的原型定义了它: NetStream* NetStream::connect(char *ip, char

好的,我正在开发一个小型网络库,用于我的另一个应用程序。我在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 -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_
...
当我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
在使用my NetLib的应用程序中的对象文件中,objdump显示它正在导入具有相同原型的函数:

NetStream* NetStream::connect(char *ip, char *port, char** error) {
  ...
}
$ 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-lnetstream.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++connection.cpp.o-lnetstream.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++命令行选项的含义,因为您严重误用了它们

-Ldirectory告诉链接器在目录中查找库文件。除非您有一个名为“NetStream.cpp.o”的目录(这不太可能),并且您在该目录中指定了要链接的库(您没有),否则您的命令行是乱七八糟的

您的命令行实际上是告诉链接器在目录中查找库文件,但没有提供有关要链接的库的任何信息。所以你的“NetLib.a”甚至不被链接器访问


假设您在一个名为NetLib的目录(相对于调用g++时的工作目录)中有一个名为NetLib.a的库,那么——正如俄罗斯人所指出的那样——您要么需要执行“g++connection.cpp.o-LNetLib-LNetLib-o/tmp/tst”来链接该库,要么执行“g++connection.cpp.o NetLib/libNetLib.a-o/tmp/tst”.

您确实需要查找g++命令行选项的含义,因为您严重误用了它们

-Ldirectory告诉链接器在目录中查找库文件。除非您有一个名为“NetStream.cpp.o”的目录(这不太可能),并且您在该目录中指定了要链接的库(您没有),否则您的命令行是乱七八糟的

您的命令行实际上是告诉链接器在目录中查找库文件,但没有提供有关要链接的库的任何信息。所以你的“NetLib.a”甚至不被链接器访问


假设您在一个名为NetLib的目录(相对于调用g++时的工作目录)中有一个名为NetLib.a的库,那么——正如俄罗斯人所指出的那样——您要么需要执行“g++connection.cpp.o-LNetLib-LNetLib-o/tmp/tst”来链接该库,要么执行“g++connection.cpp.o NetLib/libNetLib.a-o/tmp/tst”.

为什么会有不同?是的,它可以工作,但我不能像那样编译我的代码,也不能回答这样的问题:“这里真正的问题是什么”链接行只是我用来测试CMake是否有问题的东西。我建造了它,所以这可能就是它没有真正起作用的原因。正如Peter所说,我真的需要查找g++命令行的用法。当然,如果我的测试结果为假阴性,那会让我错误地认为CMake工作正常。但是,因为它在我调整命令行时起作用,这意味着CMake是个问题。事实证明,出于某种原因,CMake并没有将NetLib链接进来。已经修好了now@Xenotoad我没有意识到“这个链接命令完全是假的”并不是一个足够的线索,让你看看手册页并理解为什么会这样;你需要一个详细的解释,为什么会有不同?是的,它是有效的,但我不能像那样编译我的代码,它也不能回答这样的问题:“这里真正的问题是什么”链接行就是这样的