想象一下,我正在编译(静态)库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
我的问题是:我应该在我的APP
内libfoo.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但它并没有讨论 这实际上是如何实现的。
答案 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.html和http://www.vtk.org/Wiki/CMake:How_To_Write_Platform_Checks。