c++ - CMAKE - 为库设置编译标志

标签 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")
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 为库分别设置 Release 和 Debug 标志?

最佳答案

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

在本地更改这些编译器/链接器选项,您需要特定于配置的目​​标属性或 generator expressions .所以采取你的第二种方法和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"
)

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

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

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

如果您为 main 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 在编译器检测期间设置的同名缓存变量。有关详细信息,请参阅:

关于c++ - CMAKE - 为库设置编译标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31621092/

相关文章:

c++ - 数组的行操作

c++ - 无法让 Qt Hello World 工作

c++ - Qt为多行文本绘制轮廓

regex - CMake 正则表达式匹配

xcode - 如何使用 cmake 将资源包添加到 xcode 项目中?

c++ - xstring 中未定义的类型和未声明的标识符

java - java处理外部库的正确方法(使用eclipse)

java - 使用 Gradle 在 Eclipse 中自动下载库

c++ - 警告 : comparison between signed and unsigned integer expressions. 。如何解决?

c - 使用列表作为 add_custom_command 的依赖项