包括外部标题,找出编译器选项

时间:2012-08-26 19:49:27

标签: c++ c compilation header-files

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

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

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

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

我得到的大量错误都来自外部标题。 原来他们需要一些编译器标志。

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

到目前为止我对此的看法:

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

2 个答案:

答案 0 :(得分:1)

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

在可以使用pkg-config的地方,只需要告诉构建系统您要导入哪些组件。例如。在autotools上。

PKG_CHECK_MODULES([DEPS], [libname])

然后在.am文件中使用DEPS_CFLAGSDEPS_LIBS变量。

E.g。在shell命令行上:

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

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

答案 1 :(得分:0)

对于标题,这很少有关于编译器标志的错误,或者很容易在该标题中解决它(例如使用#ifdef ..#endif或尝试使用#r重写一部分代码更为人熟知的模式)
但更多可能的错误是这样的:你直接包含标题,但该标题依赖于其他标题(可能来自系统或来自同一个库),你忘记在主要包含文件之前包含它们。(实际上这是程序员忘了让他们的标题独立,只是他们忘记在主包含文件中以正确的顺序包含他们文件的所有必需标题。)
因此,为了测试这个标准,请查看库的源代码(您说它已正确编译)。查看主要包含文件之前包含的内容,您可能会发现您的包含文件依赖于包含在其中的包含文件
例如,在MSVC和GCC中,您都可以使用预编译的头文件,预编译头文件中的任何包含都将自动包含在包含它的所有源文件中,因此如果您忘记在其中一个公共头文件中添加内容并将其包含在预编译中标题您的代码将被正确编译,但如果有人包含您的公共标题将收到错误
或者如果您在private_header_1.h中定义某些内容并在公共标题中使用它,然后在源文件中使用它(例如impl.cpp),您会说:     #include“private_header_1.h”     #include“public_header.h” 再次,您的代码将被正确编译,但在另一个代码中包含public_header.h将引发错误