如何使用(配置文件)包含编译时依赖#defines的外部头文件?

时间:2016-07-16 00:50:22

标签: c++ cmake

想象一下,我正在编译(静态)库libfoo.a,它提供了头文件foo.h。我将在源代码中将我的应用APPlibfoo.a#include <foo.h>相关联。 libfoo正在使用CMake作为构建系统,其中包含用户定义的变量,例如BUILD_WITH_OPTION_BAR作为编译器的定义传递:

ADD_DEFINITIONS(BUILD_WITH_OPTION_BAR)

foo.h内,我们会使用此选项找到#ifdef声明:

#ifdef BUILD_WITH_OPTION_BAR
   typedef long long int fooInt;
#else
   typedef int fooInt;
#endif

我的问题是:我应该在我的APPlibfoo.a了解BUILD_WITH_OPTION_BAR是否使用BUILD_WITH_OPTION_BAR构建?

换句话说:我必须在APP内定义libfoo的位置和时间?

我的基本理解是,图书馆config.h应该提供foo.h内的#define BUILD_WITH_OPTION_BAR文件,但是如何获得可选 libfoo在编译时(NSData)?

我发现了这个相关的问题:add_definitions vs. configure_file但它并没有讨论 这实际上是如何实现的。

1 个答案:

答案 0 :(得分:1)

这样做的方法是创建一个&#34; config.h&#34;带有定义的文件,而不是将它们作为命令行参数传递给编译器。您可以使用库文件分发config.h文件。

Cmake提供了一种生成此类文件的机制。

CONFIGURE_FILE(<src filename>, <dest filename>)

通常,源文件名为&#34; config.h.in&#34;输出文件名为&#34; config.h&#34;。在.in文件行中这样:

#cmakedefine BUILD_WITH_OPTION_BAR 1

替换为

#define BUILD_WITH_OPTION_BAR 1

如果启用该选项,则会将其注释掉。

有关详情,请参阅https://cmake.org/cmake/help/v3.0/command/configure_file.htmlhttp://www.vtk.org/Wiki/CMake:How_To_Write_Platform_Checks

相关问题