【发布时间】: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 reference 和 this 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/…