1

我正在尝试将一些网络代码包含到我的 C++ 应用程序中。我下载了 CSimpleSocket并将所有 .h 和 .cpp 文件复制到我的主文件所在的目录中。然后我尝试包含一个标题,但链接器只是抛出一堆错误,比如:

  • [链接器错误] 未定义对 CPassiveSocket::CPassiveSocket(CSimpleSocket::CSocketType)' 的引用
  • [链接器错误] 未定义对 `CSimpleSocket::Initialize()' 的引用
  • [链接器错误] 未定义对 `CPassiveSocket::Listen(unsigned char const*, short, int)' 的引用
  • [链接器错误] 未定义对 `CPassiveSocket::Accept()' 的引用

和别的。一切都在一个目录中,所以我认为这不是问题。我用来包含的代码是#include "PassiveSocket.h". 我正在使用 Dev-C++,如果这有什么不同的话。我不明白我做错了什么,所以如果有人可以帮助我,那就太好了。

如果这是一个非常愚蠢的问题,请原谅我,但我正在努力学习 C++,这并不容易。谢谢你的帮助。

4

1 回答 1

4

您收到此错误的原因是您的编译器找不到与 CSimpleSocket 标头对应的二进制文件。好像你写的

void someFunction(int someArg);

然后从未提供过 someFunction 的实现。

要使用第三方库,您需要两件事:

  • 头文件(.h、.hpp 等...)
  • 库文件(.a、.lib 等...)

获得头文件和库文件后,您需要将它们放在编译器可以找到的位置。这个地方会根据你的操作系统、环境变量和编译器配置而有所不同。

现在它们在编译器可以找到它们的地方,您需要告诉编译器使用它们。头文件与#include 命令一起使用,库文件通过向编译器提供参数来链接。

在幕后 Dev-C++ 使用 MinGW GNU GCC 编译器,它调用类似于g++ file1.cpp file2.cpp ... filen.cpp -o filename告诉程序 g++ 使用文件 1 到 n 编译名为“filename”的 C++ 可执行文件的命令。还有其他标志可以添加到 g++,例如告诉它在哪里搜索和链接什么。

CSimpleSocket 库编译时的名称是“clsocket”,所以我们需要找到一种方法来配置 Dev-C++ 以添加-lclsocketg++命令中。我不使用 Dev-C++,所以在这里我无法为您提供帮助,但您可能正在编译配置中寻找“链接选项”或类似的东西。您还需要确保 .lib 和 .h 文件位于搜索路径上,这也应该可以在 Dev-C++ 中进行配置。

CSimpleSocket 还提供了一个安装程序,它应该自动创建 .lib 文件并将 .lib 和 .h 放在可以找到它们的位置,您应该考虑使用该安装程序。

我认为这个答案的复杂性凸显了 C++ 库集成生态系统的糟糕状态。不幸的是,在撰写本文时,C++ 中还没有“模块”的概念。

于 2013-01-07T02:31:35.653 回答