想象一下,我正在编译(一个静态)库libfoo.a,它提供了一个头文件foo.h. 我会链接到我的应用程序APP对libfoo.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
Run Code Online (Sandbox Code Playgroud)
我的问题是:我怎么知道我的里面APP这libfoo.a是构建有或没有BUILD_WITH_OPTION_BAR?
换句话说:我必须在何时何地BUILD_WITH_OPTION_BAR在我的APP?
我的基本认识是,图书馆libfoo应该提供某种形式的config.h被里面包含的文件foo.h,但你如何得到一个可选的 #define BUILD_WITH_OPTION_BAR在那里在编译时(的libfoo)?
我发现了这个相关的问题:add_definitions vs. configure_file但它没有讨论这实际上是如何完成的。
方法是使用定义创建一个“config.h”文件,而不是将它们作为命令行参数传递给编译器。您可以将 config.h 文件与库文件一起分发。
Cmake 提供了生成此类文件的机制。
CONFIGURE_FILE(<src filename>, <dest filename>)
Run Code Online (Sandbox Code Playgroud)
通常,源文件名为“config.h.in”,输出文件名为“config.h”。在 .in 文件行中,如下所示:
#cmakedefine BUILD_WITH_OPTION_BAR 1
Run Code Online (Sandbox Code Playgroud)
被替换为
#define BUILD_WITH_OPTION_BAR 1
Run Code Online (Sandbox Code Playgroud)
如果启用该选项,否则它们将被注释掉。
请参阅https://cmake.org/cmake/help/v3.0/command/configure_file.html和http://www.vtk.org/Wiki/CMake:How_To_Write_Platform_Checks了解更多信息。