【问题标题】:CMAKE - setting compile flags for librariesCMAKE - 为库设置编译标志
【发布时间】:2015-07-24 23:07:44
【问题描述】:

我有一个 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 标志?

【问题讨论】:

    标签: c++ cmake libraries flags


    【解决方案1】:

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

    在本地更改那些编译器/链接器选项,您需要特定于配置的目​​标属性或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 版本 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 的生成器采用在任何 CMakeLists.txt 文件末尾为 CMAKE_&lt;LANG&gt;_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 在编译器检测期间设置的同名缓存变量。更多详情见:

    【讨论】:

    • 非常好的答案,感谢您的参考。我相信 2.8.12 支持带有生成器的 target_compile_options。
    • 我必须从生成器示例中删除引号才能使其与 GCC 9.2 一起使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-16
    • 2021-02-27
    • 2012-06-18
    • 1970-01-01
    • 2022-09-27
    相关资源
    最近更新 更多