【问题标题】:How to set/unset compiler flags in a cmake project?如何在 cmake 项目中设置/取消设置编译器标志?
【发布时间】:2022-09-27 19:04:45
【问题描述】:

我是 cmake 的新手,并使用 qt creator 提供的脚手架制作了一个 cmake 项目。我以源代码形式添加了一个库(assimp)。在使用默认工具包 (mingw) 编译我的项目时,我收到了以下错误:

error: ignoring \'#pragma warning \' [-Werror=unknown-pragmas]

我知道标志 \"-Werror=unknown-pragmas\" 要求编译器将未知的编译指示视为错误。 Assimp 有许多 gcc 不理解的编译指示指令,所以我不想将该标志传递给编译器。我查看了设置,但找不到设置标志的位置。如何禁用它以便我的程序编译?

[编辑]: 我搜索了 Assimp 库的 cmake 文件,找不到罪魁祸首编译器标志。这让我觉得它与 qt 在调用它时传递给 cmake 的内容有关。在 Projects->Build Settings->Cmake->Initial Configuration 中,我发现:

-DCMAKE_CXX_FLAGS_INIT:STRING=%{Qt:QML_DEBUG_FLAG}

这意味着什么?

[编辑]:我在 Assimp 中发现了一个缓存变量,它可以将警告作为错误启用。原谅我看的不够好。

assimp/code/cmakelists.txt 中的相关代码:

IF (ASSIMP_WARNINGS_AS_ERRORS)
  MESSAGE(STATUS \"Treating all warnings as errors (for assimp library only)\")
  IF (MSVC)
    TARGET_COMPILE_OPTIONS(assimp PRIVATE /W4 /WX)
  ELSE()
    TARGET_COMPILE_OPTIONS(assimp PRIVATE -Wall -Werror)
  ENDIF()
ENDIF()
  • 你找不到unkown-pragmas 最有可能被设置,因为它没有明确设置。它是-Wall -Werror(也许还有其他人)godbolt.org/z/xqdj4on3E 的一部分
  • 一个好的做法是创建单独的目标,它只处理编译标志,所有其他目标都将链接到。我recommend watch this 涵盖了这个主题(和其他主题)。

标签: c++ gcc cmake


【解决方案1】:

我个人通过target_compile_options 为特定目标添加编译标志。例如:

target_compile_options(my_app PRIVATE -Werror)

注意:

  1. 您需要一个通过add_library 或add_executable 创建的目标,并且
  2. 您也可以使用INTERFACE 或PUBLIC 代替PRIVATE。如果它是“最终”目标,您不打算与其他任何东西链接,PRIVATE 应该是要走的路。

    现在,如果您要链接到库,例如assimp,并且您收到来自该库的编译器错误,我认为您想要的是在将该库添加到目标的包含目录时使用 SYSTEM:

    target_include_directories(my_app SYSTEM PRIVATE ${ASSIMP_INCLUDE_DIR})

【讨论】:

    【解决方案2】:

    删除/取消设置 Cmake 标志

    我能想到的最佳选择是编辑 assimp 的 cmake 文件,删除 -Wall 和其他类似标志。

    我也会看看这个问题:CMake - remove a compile flag for a single translation unit

    设置 Cmake 标志

    尽管这对取消设置标志没有帮助,但您可以使用 set 函数设置 C++ 编译器标志:

    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -Llib -lwhatever")
    

    将上述标志替换为您的标志。

    正如 Marek K 在评论中所说,设置全局标志被认为是不好的做法,您应该为每个目标应用标志。

    【讨论】:

    • 为标志设置全局变量在现代 CMake 中被认为是一种不好的做法。建议在目标上应用标志。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-16
    • 2018-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多