【问题标题】:How to specify system include directories as `-isystem` in CMake如何在 CMake 中将系统包含目录指定为“-isystem”
【发布时间】:2021-10-30 11:12:51
【问题描述】:

在 CMake 中,我知道我可以做到

target_include_directories(my_target SYSTEM PRIVATE ${SOME_THIRD_PARTY_LIBRARY_INCLUDES})

为了避免捕获来自该库的警告,如果我将这些警告定义为我的环境中的错误,可能会停止我的编译:

list(APPEND CXX_COMPILER_FLAGS_TO_USE "-Werror")

但是,我不知道如何将该行为扩展到系统包含目录。例如,在使用 GCC 10 的 CentOS 7 中,我无法启用 -Wundef,因为系统包含 fail 因为它:

list(APPEND CXX_COMPILER_FLAGS_TO_USE "-Wundef")

原因:

In file included from /opt/rh/devtoolset-10/root/usr/include/c++/10/x86_64-redhat-linux/bits/c++config.h:2791,
                 from /opt/rh/devtoolset-10/root/usr/include/c++/10/cmath:41,
                 ...
/opt/rh/devtoolset-10/root/usr/include/c++/10/pstl/pstl_config.h:47:5: error: "__clang__" is not defined, evaluates to 0 [-Werror=undef]
   47 | #if __clang__
      |     ^~~~~~~~~
compilation terminated due to -Wfatal-errors.
cc1plus: all warnings being treated as errors

/opt/rh/devtoolset-10/root/usr/include/ 从未被我的配置文件显式添加,而是由 CMake 自动检测到。

有没有办法告诉 CMake 将所有编译器添加的包含目录视为SYSTEM?我可以手动添加这些目录,例如:

target_include_directories(my_target SYSTEM PRIVATE /opt/rh/devtoolset-10/root/usr/include)

但我不认为这是一个优雅的,甚至可能不是正确的解决方案。

我正在阅读 this referencethis reference,但它们似乎并未涵盖此处描述的相同问题。

PS:以防万一,我正在定义要与命令一起使用的编译器:

SET(CMAKE_CXX_COMPILER "/opt/rh/devtoolset-10/root/usr/bin/g++")
SET(CMAKE_C_COMPILER "/opt/rh/devtoolset-10/root/usr/bin/gcc")

作为我的根 CMakeLists.txt 中的第一行,否则 CMake 会尝试使用 CentOS 提供的默认 GCC 4.8。

非常感谢您的帮助。

【问题讨论】:

  • 这似乎是一个非常有用的属性,可以设置,我猜CMake没有考虑过。
  • 感谢您的建议,我刚刚在CMake论坛发了一个问题:discourse.cmake.org/t/…

标签: c++ cmake include centos7


【解决方案1】:

我的 2 美分,

–system-header-prefix=–no-system-header-prefix= 命令行 参数可用于覆盖是否包含路径的子集 被视为系统头文件。当找到 #include 指令中的名称时 在标头搜索路径中并以系统前缀开头,标头是 被视为系统头文件。命令行上的最后一个前缀 匹配指定的标头名称优先。例如:

 $ clang -Ifoo -isystem bar --system-header-prefix=x/ \
  --no-system-header-prefix=x/y/

这里,#include "x/a.h" 被视为包含系统标头,即使 header 在 foo 中找到,并且 #include "x/y/b.h" 被视为不包括 系统标头,即使标头在 bar 中。

参考:https://clang.llvm.org/docs/UsersManual.html#controlling-diagnostics-in-system-headers

否则您是否尝试查看默认情况下不将自己的头文件视为系统头文件是否不是编译器的问题?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-10
    • 1970-01-01
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多