C++ CMAKE-设置库的编译标志

C++ CMAKE-设置库的编译标志,c++,cmake,libraries,flags,C++,Cmake,Libraries,Flags,我有一个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")

我有一个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")
这些都没有效果

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

SET_TARGET_PROPERTIES(MyLib PROPERTIES COMPILE_FLAGS "/W3 /nologo /EHsc")
这将更改调试和发布的标志


我该如何使用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>"
)
我个人喜欢“旧”的方法来做得更好,因为它取代了VisualStudio项目属性中的默认选项。通过
target\u compile\u options()
传递的任何内容都将在
Configuration Properties/C/C++/命令行/Additional options
中结束

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

CMake的生成器将在任何
CMakeLists.txt
文件末尾为
CMake\uu标志设置的内容作为生成生成环境时的默认编译器选项,应用于同一
CMakeLists.txt
文件中的所有库和可执行目标

如果为子目录
CMakeLists.txt
中的main
CMakeLists.txt
目标设置链接器变量,则不会有帮助(范围错误)。如果我将上面的代码放入主
CMakeLists.txt
中,它确实有效,我会收到以下警告(因为您使用了链接器的编译器选项):

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


回答得很好,谢谢你的推荐。我相信中支持带有生成器的target_compile_选项。我必须删除生成器示例中的引号,才能在GCC 9.2中使用。
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"
)
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