CMAKE - 为库设置编译标志

aqu*_*ket 2 c++ flags cmake 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")
Run Code Online (Sandbox Code Playgroud)

这些都没有效果......

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

SET_TARGET_PROPERTIES(MyLib PROPERTIES COMPILE_FLAGS "/W3 /nologo /EHsc")
Run Code Online (Sandbox Code Playgroud)

这将改变Debug和Release的标志

我怎样才能使用CMake为库分别设置Release和Debug标志?

Flo*_*ian 10

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

在本地更改这些编译器/链接器选项需要特定于配置的目​​标属性或生成器表达式.那么采用第二种方法,如何使用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>"
)
Run Code Online (Sandbox Code Playgroud)

或者对于CMake版本<= 2.8.12(参见政策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"
)
Run Code Online (Sandbox Code Playgroud)

我个人喜欢"OLD"做得更好的方式,因为它取代了Visual Studio项目属性中的默认选项.通过的任何东西都target_compile_options()将最终通过Configuration Properties / C/C++ / Command Line / Additional Options.

您的第一种方法不起作用的一些背景信息:

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

如果为CMakeLists.txt子目录中的主要目标设置链接器变量,CMakeLists.txt则无效(范围错误).如果我将上面的代码放到main中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
Run Code Online (Sandbox Code Playgroud)

我现在隐藏了在编译器检测期间由CMake设置的同名缓存变量.有关更多详情,请参阅