麻烦包括我的C ++应用程序中的第三方代码

时间:2013-01-07 02:18:35

标签: c++ include

我正在尝试将一些网络代码包含到我的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 ++,这并不容易。谢谢你的帮助。

1 个答案:

答案 0 :(得分: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 ++以将-lclsocket添加到g++命令。我不使用Dev-C ++,所以我不能帮助你,但你可能正在寻找“链接选项”或类似的编译配置。您还需要确保.lib和.h文件位于搜索路径上,该路径也应该可以在Dev-C ++中进行配置。

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

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