多平台上的 CMake 多配置生成器

CMake multi config generator on multi platform

我正在开发一个项目,该项目使用 CMake 生成需要在 Windows 和 Linux 平台上编译的基于多平台的 C++ 项目。在基于 Windows 的项目中,我有兴趣生成具有以下四种配置文件配置的基于 MSVC 的解决方案:(调试、发布、RelWithDebInfo 和 MinSizeRel)。

请注意,我设置了一些变量(FLAGS_COMPILE_DEBUG、DEFS_COMPILE_DEBUG、LINKER_OPTIONS_DEBUG、FLAGS_COMPILE_RELEASE、DEFS_COMPILE_RELEASE 和 LINKER_OPTIONS_RELEASE)包含每个基于调试和发布的解决方案配置文件的所有特定标志。

set(FLAGS_COMPILE_DEBUG "/MTd /Od /Zi /RTC1 /Zc:wchar_t /GS /WX")
set(DEFS_COMPILE_DEBUG "-D_DEBUG")
set(LINKER_OPTIONS_DEBUG "/WX")

set(FLAGS_COMPILE_RELEASE "/Ox /Ob2 /Oi /Ot /GF /Zc:wchar_t /MT /WX")
set(DEFS_COMPILE_RELEASE "-D_NDEBUG")
set(LINKER_OPTIONS_RELEASE "/WX")

# Each one VS profile configurations
add_compile_options($<$<CONFIG:Debug>:${FLAGS_COMPILE_DEBUG}>)
add_definitions($<$<CONFIG:Debug>:${DEFS_COMPILE_DEBUG}>)
add_link_options($<$<CONFIG:Debug>:${LINKER_OPTIONS_DEBUG}>)

add_compile_options($<$<CONFIG:Release>:${FLAGS_COMPILE_RELEASE}>)
remove_definitions($<$<CONFIG:Release>:${DEFS_COMPILE_DEBUG}>)
add_definitions($<$<CONFIG:Release>:${DEFS_COMPILE_RELEASE}>)
add_link_options($<$<CONFIG:Release>:${LINKER_OPTIONS_RELEASE}>)

add_compile_options($<$<CONFIG:RelWithDebInfo>:${FLAGS_COMPILE_RELEASE}>)
add_definitions($<$<CONFIG:RelWithDebInfo>:${DEFS_COMPILE_DEBUG}>)
add_link_options($<$<CONFIG:RelWithDebInfo>:${LINKER_OPTIONS_DEBUG}>)

add_compile_options($<$<CONFIG:MinSizeRel>:${FLAGS_COMPILE_RELEASE}>)
remove_definitions($<$<CONFIG:MinSizeRel>:${DEFS_COMPILE_DEBUG}>)
add_definitions($<$<CONFIG:MinSizeRel>:${DEFS_COMPILE_RELEASE}>)
add_link_options($<$<CONFIG:MinSizeRel>:${LINKER_OPTIONS_RELEASE}>)

但是,我注意到我没有为每个基于调试和发布的解决方案配置文件获得预期的效果。在我的案例中使用 CMake 生成器表达式的正确方法是什么?

add_definitions()remove_definitions() 不支持生成器表达式。你想要 add_compile_definitions().

set(FLAGS_COMPILE_DEBUG /MTd /Od /Zi /RTC1 /Zc:wchar_t /GS /WX)
set(DEFS_COMPILE_DEBUG -D_DEBUG)
set(LINKER_OPTIONS_DEBUG /WX)

set(FLAGS_COMPILE_RELEASE /Ox /Ob2 /Oi /Ot /GF /Zc:wchar_t /MT /WX)
set(DEFS_COMPILE_RELEASE -D_NDEBUG)
set(LINKER_OPTIONS_RELEASE /WX)

add_compile_options(
    "$<$<CONFIG:Debug>:${FLAGS_COMPILE_DEBUG}>"
    "$<$<CONFIG:Release>:${FLAGS_COMPILE_RELEASE}>"
    "$<$<CONFIG:RelWithDebInfo>:${FLAGS_COMPILE_RELEASE}>"
    "$<$<CONFIG:MinSizeRel>:${FLAGS_COMPILE_RELEASE}>"
)
add_compile_definitions(
    "$<$<CONFIG:Debug>:${DEFS_COMPILE_DEBUG}>"
    "$<$<CONFIG:Release>:${DEFS_COMPILE_RELEASE}>"
    "$<$<CONFIG:RelWithDebInfo>:${DEFS_COMPILE_DEBUG}>"
    "$<$<CONFIG:MinSizeRel>:${DEFS_COMPILE_RELEASE}>"
)
add_link_options(
    "$<$<CONFIG:Debug>:${LINKER_OPTIONS_DEBUG}>"
    "$<$<CONFIG:Release>:${LINKER_OPTIONS_RELEASE}>"
    "$<$<CONFIG:RelWithDebInfo>:${LINKER_OPTIONS_DEBUG}>"
    "$<$<CONFIG:MinSizeRel>:${LINKER_OPTIONS_RELEASE}>"
)