如何使用CMake为特定目标创建C#define?

Mar*_*mer 19 cmake

我现在感觉有点愚蠢.在最近将一些较小的项目转换为使用CMake之后,我决定还删掉一些"Platform_Config.h"文件.这些文件包含一些预处理指令,如#define USE_NEW_CACHE控件编译.

我将如何"转换"这些定义以便用CMake控制?理想情况下,通过使用这些"缓存"变量,用户可以轻松编辑.

And*_*dré 22

有两种选择.您可以使用add_definitions方法将定义作为编译器标志传递:例如,项目中的某处cmakelists.txt:

add_definitions( -DUSE_NEW_CACHE )
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

然后运行

configure_file( ${CMAKE_SOURCE_DIR}/Platform_Config.h.in ${CMAKE_BINARY_DIR}/common/Platform_Config.h )
Run Code Online (Sandbox Code Playgroud)

它将在build-dir中生成一个新的Platform_Config文件.cmake中的那些变量也是一个cmakedefine,它们将出现在生成的文件中,其他变量将被注释掉或取消.

当然,在将其包含在源文件中时,应确保正确找到实际生成的文件.


0xb*_*00d 13

option命令可能会提供您要查找的内容.
将它与目标上的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()
Run Code Online (Sandbox Code Playgroud)

编辑:

我在示例中写的选项显示为CMake GUI中的复选框.

  • 为了将来参考,set_target_properties的正确语法是:set_target_properties(myProgram PROPERTIES COMPILE_DEFINITIONS"DEBUGPRINTS = 1") (5认同)