【问题标题】:How to create a C #define for a certain target using CMake?如何使用 CMake 为某个目标创建 C#define?
【发布时间】:2011-03-18 12:39:02
【问题描述】:

我现在觉得有点傻。在最近将一些较小的项目转换为使用 CMake 之后,我决定也摆脱一些“Platform_Config.h”文件。这些文件包含一些预处理指令,如#define USE_NEW_CACHE 和控制编译。

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

【问题讨论】:

    标签: cmake


    【解决方案1】:

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

    add_definitions( -DUSE_NEW_CACHE )
    

    CMake 将确保将 -D 前缀转换为编译器的正确标志(/D 用于 msvc,-D 用于 gcc)。

    或者,查看configure_file。它更复杂,但可能更适合您使用 Platform_Config 文件的原始方法。

    您可以创建一个类似于原始 Platform_Config.h 的输入文件,并在其中添加“#cmakedefine”行。

    让我们在 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 )
    

    它将在您的构建目录中生成一个新的 Platform_Config 文件。 cmake 中那些也是 cmakedefine 的变量将出现在生成的文件中,其他变量将被注释掉或取消定义。

    当然,您应该确保在将实际生成的文件包含在源文件中时正确找到它。

    【讨论】:

      【解决方案2】:

      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()
      

      编辑:

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

      【讨论】:

      • 为了将来参考,set_target_properties 的正确语法是:set_target_properties(myProgram PROPERTIES COMPILE_DEFINITIONS "DEBUGPRINTS=1")
      【解决方案3】:

      如果您想为每个目标设置定义:从 2.8.11 开始,您可以使用 target_compile_definitions

      在早期版本中,您可能不想按原样使用set_target_properties,因为它会覆盖您之前设置的任何定义。请先调用get_target_property,然后与之前的值合并。见add_target_definitionshere

      【讨论】:

      【解决方案4】:

      使用 target_compile_options。不要引用您的定义,否则它不会被检测为定义。 CMake 解析 /define 并将实际定义添加到 csproj 的 DefineConstants 部分,如果有引号,它将把整个带引号的字符串放在 csproj 的 AdditionalOptions 部分中。

      我的一个项目中使用生成器表达式的示例:

      target_compile_options( ${LIBRARY_NAME} PRIVATE
          $<${IS_ART_ITERATION_BUILD}:/define:ART_ITERATION_BUILD>
      )
      

      一个没有生成器表达式的例子:

      target_compile_options( ${LIBRARY_NAME} PRIVATE
          /define:GRAPHICS_VULKAN
      )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-11-22
        • 2020-01-17
        • 1970-01-01
        • 1970-01-01
        • 2014-03-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多