CMAKE - 为库设置编译标志

CMAKE - setting compile flags for libraries

我有一个 CMakeLists.txt 脚本来编译我的库。 问题是我无法为库设置编译标志。

我试过了

SET(CMAKE_CXX_FLAGS "/W3 /nologo /EHsc")
SET(CMAKE_CXX_FLAGS_DEBUG "/MTd /Od /Ob0 /Zi /RTC1 /DDEBUG /D_DEBUG")
SET(CMAKE_CXX_FLAGS_RELEASE "/MT /O2 /Ob2 /DNDEBUG")
SET(CMAKE_C_FLAGS "/W3 /nologo /EHsc")
SET(CMAKE_C_FLAGS_DEBUG "/MTd /Od /Ob0 /Zi /RTC1 /DDEBUG /D_DEBUG")
SET(CMAKE_C_FLAGS_RELEASE "/MT /O2 /Ob2 /DNDEBUG")
SET(CMAKE_EXE_LINKER_FLAGS "/W3 /nologo /EHsc")
SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "/MTd /Od /Ob0 /Zi /RTC1 /DDEBUG /D_DEBUG")
SET(CMAKE_EXE_LINKER_FLAGS_RELEASE "/MT /O2 /Ob2 /DNDEBUG")
SET(CMAKE_MODULE_LINKER_FLAGS "/W3 /nologo /EHsc")
SET(CMAKE_MODULE_LINKER_FLAGS_DEBUG "/MTd /Od /Ob0 /Zi /RTC1 /DDEBUG /D_DEBUG")
SET(CMAKE_MODULE_LINKER_FLAGS_RELEASE "/MT /O2 /Ob2 /DNDEBUG")
SET(CMAKE_SHARED_LINKER_FLAGS "/W3 /nologo /EHsc")
SET(CMAKE_SHARED_LINKER_FLAGS_DEBUG "/MTd /Od /Ob0 /Zi /RTC1 /DDEBUG /D_DEBUG")
SET(CMAKE_SHARED_LINKER_FLAGS_RELEASE "/MT /O2 /Ob2 /DNDEBUG")
SET(CMAKE_STATIC_LINKER_FLAGS "/W3 /nologo /EHsc")
SET(CMAKE_STATIC_LINKER_FLAGS_DEBUG "/MTd /Od /Ob0 /Zi /RTC1 /DDEBUG /D_DEBUG")
SET(CMAKE_STATIC_LINKER_FLAGS_RELEASE "/MT /O2 /Ob2 /DNDEBUG")

None 有效...

我可以更改库标志的唯一方法是这样。

SET_TARGET_PROPERTIES(MyLib PROPERTIES COMPILE_FLAGS "/W3 /nologo /EHsc")

这将更改调试和发布的标志

究竟如何使用 CMake 为库分别设置 Release 和 Debug 标志?

这些是您在第一种方法中尝试覆盖的全局缓存变量。

在本地更改那些 compiler/linker 选项,您需要特定于配置的目​​标属性,否则 generator expressions. So taking your second approach and How can I set specific compiler flags for a specific target in a specific build configuration using CMake? 我会得到:

target_compile_options(
    MyLib PRIVATE 
    /W3 /nologo /EHsc
    "$<$<CONFIG:Debug>:/MTd;/Od;/Ob0;/Zi;/RTC1;/DDEBUG;/D_DEBUG>"
    "$<$<CONFIG:Release>:/MT;/O2;/Ob2;/DNDEBUG>"
)

或 CMake 版本 <= 2.8.12(另见 policy CMP0043):

set_target_properties(
    MyLib PROPERTIES 
        COMPILE_FLAGS 
            "/W4 /nologo /EHsc"
        COMPILE_FLAGS_DEBUG
            "/MTd /Od /Ob0 /Zi /RTC1"
        COMPILE_FLAGS_RELEASE
            "/MT /O2 /Ob2"
        COMPILE_DEFINITIONS_DEBUG
            "DEBUG;_DEBUG"
        COMPILE_DEFINITIONS_RELEASE
            "NDEBUG"
)

我个人更喜欢 "OLD" 的方式,因为它取代了 Visual Studio 项目属性中的默认选项。通过 target_compile_options() 传递的任何内容都将在 Configuration Properties / C/C++ / Command Line / Additional Options.

中结束

关于第一种方法无效的一些背景信息:

CMake 的生成器采用任何 CMakeLists.txt 文件末尾为 CMAKE_<LANG>_FLAGS 设置的任何内容,并将其作为默认编译器应用于同一 CMakeLists.txt 文件中的所有库和可执行目标生成构建环境时的选项。

如果您在子目录 CMakeLists.txt 中为您的主要 CMakeLists.txt 目标设置链接器变量,这将无济于事(范围错误)。如果我将上面的代码放入主 CMakeLists.txt 它确实有效并且我收到以下警告(因为您使用了链接器的编译器选项):

1>LINK : warning LNK4044: unrecognized option '/W3'; ignored
1>LINK : warning LNK4044: unrecognized option '/EHsc'; ignored
1>LINK : warning LNK4044: unrecognized option '/MTd'; ignored
1>LINK : warning LNK4044: unrecognized option '/Od'; ignored
1>LINK : warning LNK4044: unrecognized option '/Ob0'; ignored
1>LINK : warning LNK4044: unrecognized option '/Zi'; ignored
1>LINK : warning LNK4044: unrecognized option '/RTC1'; ignored
1>LINK : warning LNK4044: unrecognized option '/DDEBUG'; ignored
1>LINK : warning LNK4044: unrecognized option '/D_DEBUG'; ignored

我现在隐藏了在编译器检测期间由 CMake 设置的同名缓存变量。有关详细信息,请参阅: