根据 CMAKE_CONFIGURATION_TYPES 生成预处理器定义
Generate preprocessor definitions based on CMAKE_CONFIGURATION_TYPES
我想使用 cmake 生成一个具有两个配置的 Visual Studio 项目。我希望 cmake 为这些配置定义不同的预处理器符号。
我用下面的命令生成项目
cmake -B intermediate/cmake -G "Visual Studio 16 2019" -T v142 -DCMAKE_GENERATOR_PLATFORM=x64
在我的 CMakeLists.txt 中,我定义了配置:
if(CMAKE_CONFIGURATION_TYPES)
set(CMAKE_CONFIGURATION_TYPES Debug Release)
endif()
现在,我该如何定义每个配置的预处理器定义?快速搜索建议不要使用 if(CMAKE_BUILD_TYPE STREQUAL "Release")
,因为它不适用于多配置生成器。
在多配置生成器中处理特定配置细节的传统方法是使用 generator expressions。
生成器表达式允许您指定仅在生成时根据生成器的当前状态(例如当前构建配置)展开的符号、值、标志等。
例如,您可以使用 -D
标志和 target_compile_definitions
:
定义自定义预处理器定义
target_compile_definitions(MyTarget PRIVATE
$<$<CONFIG:Debug>:DEBUG_ONLY=1>
$<$<CONFIG:Release>:RELEASE_ONLY=2>
FOO=3
)
(此示例用于 PRIVATE
定义。根据需要将其替换为 PUBLIC
或 INTERFACE
。)
这会将 -DDEBUG_ONLY=1
添加到 MyTarget
(用于调试版本)、-DRELEASE_ONLY=2
(用于发布版本)和 -DFOO=3
(用于所有版本)。
另请参阅此 relevant/similar 问题:
我想使用 cmake 生成一个具有两个配置的 Visual Studio 项目。我希望 cmake 为这些配置定义不同的预处理器符号。
我用下面的命令生成项目
cmake -B intermediate/cmake -G "Visual Studio 16 2019" -T v142 -DCMAKE_GENERATOR_PLATFORM=x64
在我的 CMakeLists.txt 中,我定义了配置:
if(CMAKE_CONFIGURATION_TYPES)
set(CMAKE_CONFIGURATION_TYPES Debug Release)
endif()
现在,我该如何定义每个配置的预处理器定义?快速搜索建议不要使用 if(CMAKE_BUILD_TYPE STREQUAL "Release")
,因为它不适用于多配置生成器。
在多配置生成器中处理特定配置细节的传统方法是使用 generator expressions。
生成器表达式允许您指定仅在生成时根据生成器的当前状态(例如当前构建配置)展开的符号、值、标志等。
例如,您可以使用 -D
标志和 target_compile_definitions
:
target_compile_definitions(MyTarget PRIVATE
$<$<CONFIG:Debug>:DEBUG_ONLY=1>
$<$<CONFIG:Release>:RELEASE_ONLY=2>
FOO=3
)
(此示例用于 PRIVATE
定义。根据需要将其替换为 PUBLIC
或 INTERFACE
。)
这会将 -DDEBUG_ONLY=1
添加到 MyTarget
(用于调试版本)、-DRELEASE_ONLY=2
(用于发布版本)和 -DFOO=3
(用于所有版本)。
另请参阅此 relevant/similar 问题: