设置库的编译标志

CMAKE - setting compile flags for libraries

本文关键字:标志 编译 设置      更新时间:2023-10-16

我有一个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")

,这将改变Debug和Release

的标志。

如何在世界上我可以设置发布和调试标志分别为一个库使用CMake?

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

在本地更改这些编译器/链接器选项,您需要特定于配置的目标属性或生成器表达式。所以采取你的第二种方法,我怎么能设置特定的编译器标志在一个特定的构建配置使用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(另见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"
)

我个人更喜欢"旧"的方式,因为它取代了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在编译器检测期间设置的同名缓存变量。详细信息请参见:

  • CMake设置和使用变量的语法是什么?
  • CMake:在哪个顺序是文件解析(缓存,工具链等)?