【发布时间】:2016-07-17 09:39:33
【问题描述】:
使用 Autotools 时,通常通过在 configure.ac 中指定 AC_CONFIG_HEADERS 宏来生成 config.h 文件,如下所示:
AC_CONFIG_HEADERS([config.h])
在使用 CMake 时,相应的等价物是什么?
【问题讨论】:
使用 Autotools 时,通常通过在 configure.ac 中指定 AC_CONFIG_HEADERS 宏来生成 config.h 文件,如下所示:
AC_CONFIG_HEADERS([config.h])
在使用 CMake 时,相应的等价物是什么?
【问题讨论】:
您必须创建一个类似于config.h.in 的文件。类似的东西
#cmakedefine HAVE_FEATURE_A @Feature_A_FOUND@
#cmakedefine HAVE_FEATURE_B @Feature_B_FOUND@
#cmakedefine HAVE_FEATURE_BITS @B_BITSIZE@
然后你必须在你的 CMake 代码中声明变量Feature_A_FOUND、Feature_B_FOUND、B_BITSIZE 并调用
configure_file(config.h.in config.h)
这将产生一个类似于自动工具中的 config.h 文件。如果未找到变量或将其设置为 false,则该行将被注释。否则将插入该值。假设Feature_A_FOUND=A-NOTFOUND¸Feature_B_FOUND=/usr/lib/b,B_BITSIZE=64,这将导致
/* #undef HAVE_FEATURE_A @Feature_A_FOUND@ */
#define HAVE_FEATURE_B /usr/lib/b
#define HAVE_FEATURE_BITS 64
可能 HAVE_FEATURE_B 最好定义为 #cmakedefine01,这取决于变量的值导致 0 或 1。
通常可以创建 Autotools 生成的每个 config.h 文件,因为 CMake 更灵活。但它需要更多的工作,你不能自动得到一个config.h,但你必须自己编写.in文件。
文档: https://cmake.org/cmake/help/v3.6/command/configure_file.html
【讨论】:
#cmakedefine 仅在标识符和值都匹配时有效,即 #cmakedefine MY_VAR @MY_VAR@ 按预期工作,但 #cmakedefine ABC @MY_VAR@ 导致 /* #undef ABC */,因为只有 MY_VAR 是一个变量(ABC 不是't)。相反,做#define ABC @MY_VAR@ 工作。很好的答案;帮助过我。谢谢!