9

假设我在互联网上找到了一个非常好的开源库,现在我想将它用于我自己的项目。

我下载它,可能编译它并获取头文件和静态/动态库。

所以我开始编写自己的源文件,当然,当我想使用这个外部库中的功能时,我会将它的正确标头包含到我的源文件中。

现在我编译我的源文件,确保这个外部库的包含路径和链接器选项设置正确。

而且我得到了一堆错误,所有这些都来自外部标题。原来他们需要一些编译器标志。

如何找出我必须设置的最小编译器标志(以便能够从外部库编译头文件)?

到目前为止我的想法是:

  1. 在源代码的构建脚本中查找它们(可能非常困难,因为有很多地方可以定义它们并且它们可能不是最小的标志,因为它们可能是所有标题一起需要的,但不是特定的我用)
  2. 谷歌每条错误消息,希望能给出答案(很多错误消息可能很难,谷歌可能不知道答案,或者我可能不知道找到答案的正确关键字)
  3. 也许以某种方式将外部库的构建脚本“包含”到我自己的项目中(可能非常困难,因为我可能想使用不同的构建系统,而且我可能必须自己完全理解构建系统,这可能很难对于更大的图书馆)
4

2 回答 2

1

任何表现良好的开源库都附带有关如何使用其开发文件的说明。在 GNU/Linux 系统上,通常将pkg-config文件 (*.pc) 一起安装到开发头文件和库中,在这种情况下,pkg-config --cflags library-name将说明所需的编译选项。

可以在哪里pkg-config使用,只需告诉构建系统您要导入哪些组件即可。例如在自动工具上。

PKG_CHECK_MODULES([DEPS], [libname])

然后在 .am 文件上使用DEPS_CFLAGS和变量。DEPS_LIBS

例如在 shell 命令行上:

$ gcc $(pkg-config --cflags libname) -c main.c
$ gcc $(pkg-config --libs libname) main.o -o test.exe

无论如何,如果您可以发布有关所使用库的特定信息以及正在生成的错误,它会更有效率。

于 2012-08-28T17:32:08.383 回答
0

对于头文件,很少有关于编译器标志的错误,或者很容易在该头文件中解决它(例如使用#ifdef..#endif 或尝试使用more wel 重写部分代码已知模式)。

但更可能的错误是这样的:您直接包含标头,但该标头依赖于其他标头(可能来自系统或来自同一库)并且您忘记在主包含文件之前包含它们。(实际上这是忘记让他们的头文件独立的程序员,他们只是忘记在主包含文件中以正确的顺序包含他们文件的所有必需头文件)。

因此,为了测试此标准,请查看库的源代码(您说它已正确编译)。查看主要包含文件之前包含的内容,您可能会发现您的包含文件依赖于包含在它之前的包含文件。

例如,在 MSVC 和 GCC 中,您都可以使用预编译头文件,并且预编译头文件中的任何包含都将自动包含在包含它的所有源文件中,因此,如果您忘记在公共头文件之一中添加某些内容并将其包含在预编译头文件中标头您的代码将被正确编译,但如果有人包含您的公共标头会出错。

或者如果您private_header_1.h在公共标头中定义并使用它,然后在源文件中使用它(例如impl.cpp你说:#include "private_header_1.h" #include "public_header.h" 再次你的代码将被正确编译,但包含public_header.h在另一个代码中会引发错误

于 2012-08-26T20:39:33.450 回答