我现在觉得有点蠢。在最近将一些较小的项目转换为使用CMake之后,我决定还删掉一些“Platform_Config.h”文件。这些文件包含一些预处理指令,如#define USE_NEW_CACHE
和控制编译。
我如何'转换'这些定义用CMake控制?理想情况下,通过使用这些“缓存”变量,用户可以轻松编辑。
答案 0 :(得分:22)
有两种选择。您可以使用add_definitions方法将定义作为编译器标志传递:例如。你项目中的某个地方cmakelists.txt:
add_definitions( -DUSE_NEW_CACHE )
CMake将确保将-D前缀转换为编译器的右侧标志(/ D表示msvc,-D表示gcc)。
或者,查看configure_file。它更复杂,但可能更适合使用Platform_Config文件的原始方法。
您可以创建一个输入文件,类似于原始的Platform_Config.h,并为其添加“#ckekedefine”行。
让我们在Platform_Config.h.in中调用:
// In Platform_Config.h.in
#cmakedefine USE_NEW_CACHE
// end of Platform_Config.h.in
然后运行
configure_file( ${CMAKE_SOURCE_DIR}/Platform_Config.h.in ${CMAKE_BINARY_DIR}/common/Platform_Config.h )
它将在build-dir中生成一个新的Platform_Config文件。 cmake中的那些变量也是一个cmakedefine,它们将出现在生成的文件中,其他变量将被注释掉或取消。
当然,在将源文件包含在源文件中时,应确保正确找到实际生成的文件。
答案 1 :(得分:13)
选项命令可能会提供您要查找的内容 将它与目标上的 COMPILE DEFINITIONS 属性一起使用,我想你已经完成了。 要在目标上设置属性,请使用命令 set target properties
option(DEBUGPRINTS "Prints a lot of debug prints")
target(myProgram ...)
if(DEBUGPRINTS)
set_target_properties(myProgram PROPERTIES COMPILE_DEFINITIONS "DEBUGPRINTS=1")
endif()
编辑:
我在示例中写的选项显示为CMake GUI中的复选框。
答案 2 :(得分:3)
如果您想为每个目标设置定义:从2.8.11开始,您可以使用target_compile_definitions
。
在早期版本中,您可能不希望按原样使用set_target_properties
,因为它会覆盖您之前设置的任何定义。首先调用get_target_property
,然后与之前的值合并。请参阅add_target_definitions
here。