【问题标题】:Suppress compiler warnings from external library in CMake在 CMake 中抑制来自外部库的编译器警告
【发布时间】:2025-12-14 10:30:01
【问题描述】:

我正在尝试按照下面复制的 CMake 说明将以下项目 https://github.com/whoshuu/cpr#cmake 构建到我的项目中:

include(FetchContent)
FetchContent_Declare(cpr GIT_REPOSITORY https://github.com/whoshuu/cpr.git GIT_TAG c8d33915dbd88ad6c92b258869b03aba06587ff9) # the commit hash for 1.5.0
FetchContent_MakeAvailable(cpr)

我的项目已经有一些与主要目标链接的其他库,因此我将这个新库包括在内,如下所示:

target_link_libraries(my_target PRIVATE cpr::cpr PUBLIC other_libraries)

问题在于构建cpr 库的警告阻止了项目的构建。我想压制这些警告。我已尝试按照此处的建议添加 SYSTEM 关键字:How to suppress GCC warnings from library headers?,因此代码如下所示:

target_link_libraries(my_target PRIVATE SYSTEM cpr::cpr PUBLIC other_libraries)

但这没有帮助。是否有其他方法可以抑制 CMake 中外部库的警告?如果有帮助,我正在使用 C++-17 g++-11 和 Ninja。

【问题讨论】:

  • 这对于 linux 和跨平台项目来说将是一个很棒的功能。 Visual Studio 16.10 最近通过一个可选设置添加了这个,包括带有尖括号的外部库:#include <cpr>
  • “来自 building cpr 库的警告正在阻止项目构建” - 因此,只有在编译 cpr 库本身时才会收到警告,而不是在包含它的标题?与FetchContent 集成的库使用那些编译器标志,这些标志是在调用FetchContent_MakeAvailable 时在CMAKE_CXX_FLAGS 中设置的。确保这些标志不会将库发出的警告视为错误。
  • 是的,只有当我尝试编译项目时。您能否详细说明编译器标志?这些标志将根据 cpr 的 CMake 文件设置对吗?
  • @nbadami,重要的问题是警告是在编译cpr/…something.cpp 时出现,还是在编译包含cpr/include 中的内容的您自己的.cpp 时出现。每个问题都需要不同的缓解措施。

标签: c++ cmake


【解决方案1】:

我知道这在技术上并不能回答您的问题,但是,作为新手,我无法发布 cmets。

我能找到的唯一方法是在代码中使用编译器编译指示禁用警告:

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Weverything"
#include <cpr/cpr.h>
#pragma GCC diagnostic pop

这取决于编译器。如果您使用 clang,只需将“GCC”替换为“clang”即可。在 Visual Studio 上,使用编译指示警告...这可以通过宏进行移植,看看this article

【讨论】: