如何让 CMake 创建一个 xcode 项目,其中警告在系统标头中被抑制?

Posted

技术标签:

【中文标题】如何让 CMake 创建一个 xcode 项目,其中警告在系统标头中被抑制?【英文标题】:How can I get CMake to create an xcode project where warnings are suppressed in system headers? 【发布时间】:2015-12-08 15:00:59 【问题描述】:

我有一个具有 3rd 方库依赖项的 CMake 项目。第 3 方库的标头会生成我关心的源代码警告。

CMake 生成的 Ninja 项目(使用 clang)不会为 3rd 方库标头生成警告。

CMake 生成的 Xcode 项目会针对 3rd 方库标头生成警告。我尝试使用 CMake 命令包含第 3 方库路径

include_directories(SYSTEM dirname1 dirname2)

但 Xcode 似乎没有对这些信息做任何事情。

如何从 CMake 生成不会对系统标头产生警告的 Xcode 项目?

Xcode 命令行只是将 -I 附加到标题包含路径上,无论我是否将 SYSTEM 添加到 CMake。

来自 Darwin.cmake 的以下部分不太令人鼓舞:

# Xcode does not support -isystem yet.
if(XCODE)
  set(CMAKE_INCLUDE_SYSTEM_FLAG_C)
  set(CMAKE_INCLUDE_SYSTEM_FLAG_CXX)
endif()

添加了额外信息

我已对概述的问题进行了小幅复制:

== CMakeLists.txt ==
include_directories(local_headers)
include_directories(SYSTEM system_headers)

set(CMAKE_CXX_FLAGS "-Werror=unused-variable")

add_executable(main main.cpp)

== main.cpp ==
#include <system_header.h>
#include "local_header.h"

int main(int, const char**)



== system_headers/system_header.h ==
int f()

  int x;
  return 5;


== local_headers/local_header.h ==
int g()

  int x = 5;
  return x;

运行 cmake -GNinja &amp;&amp; cmake --build . 构建没有错误。

运行cmake -GXcode &amp;&amp; cmake --build . 会出现以下错误: system_headers/system_header.h:3:7: error: unused variable 'x' [-Werror,-Wunused-variable] int x;

完整的 Xcode 编译路径是: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -x c++ -arch x86_64 -fmessage-length=0 -fdiagnostics-show-note-include-stack -fmacro-backtrace-limit=0 -Wno-trigraphs -fpascal-strings -O0 -Wno-missing-field-initializers -Wno-missing-prototypes -Wno-return-type -Wno-non-virtual-dtor -Wno-overloaded-virtual -Wno-exit-time-destructors -Wno-missing-braces -Wparentheses -Wswitch -Wno-unused-function -Wno-unused-label -Wno-unused-parameter -Wno-unused-variable -Wunused-value -Wno-empty-body -Wno-uninitialized -Wno-unknown-pragmas -Wno-shadow -Wno-four-char-constants -Wno-conversion -Wno-constant-conversion -Wno-int-conversion -Wno-bool-conversion -Wno-enum-conversion -Wno-shorten-64-to-32 -Wno-newline-eof -Wno-c++11-extensions -DCMAKE_INTDIR=\"Debug\" -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk -fasm-blocks -fstrict-aliasing -Wdeprecated-declarations -Winvalid-offsetof -mmacosx-version-min=10.11 -g -Wno-sign-conversion -I/Users/jon/DEV/CMakeSandbox/XcodeSystemIncludes/xcode_build/Debug/include -I/Users/jon/DEV/CMakeSandbox/XcodeSystemIncludes/local_headers -I/Users/jon/DEV/CMakeSandbox/XcodeSystemIncludes/system_headers -I/Users/jon/DEV/CMakeSandbox/XcodeSystemIncludes/xcode_build/Project.build/Debug/main.build/DerivedSources/x86_64 -I/Users/jon/DEV/CMakeSandbox/XcodeSystemIncludes/xcode_build/Project.build/Debug/main.build/DerivedSources -Wmost -Wno-four-char-constants -Wno-unknown-pragmas -F/Users/jon/DEV/CMakeSandbox/XcodeSystemIncludes/xcode_build/Debug -Werror=unused-variable -MMD -MT dependencies -MF /Users/jon/DEV/CMakeSandbox/XcodeSystemIncludes/xcode_build/Project.build/Debug/main.build/Objects-normal/x86_64/main.d --serialize-diagnostics /Users/jon/DEV/CMakeSandbox/XcodeSystemIncludes/xcode_build/Project.build/Debug/main.build/Objects-normal/x86_64/main.dia -c /Users/jon/DEV/CMakeSandbox/XcodeSystemIncludes/main.cpp -o /Users/jon/DEV/CMakeSandbox/XcodeSystemIncludes/xcode_build/Project.build/Debug/main.build/Objects-normal/x86_64/main.o

直接在命令行上运行 Xcode 编译命令会产生同样的错误。

【问题讨论】:

抑制警告只能由编译器(在您的情况下为clang)完成,而不是由 CMake 本身完成。根据clang manual,clang 自动抑制系统标头中的警告,这些路径由-isystem 选项指定。什么精确的命令行用于编译您的可执行文件? (可能,您可以在 Ninja 构建日志中找到执行的命令行)。 我只在 Xcode 中看到了这个问题。 Ninja + clang 似乎很高兴地压制#include &lt;...&gt;带来的包含警告 SYSTEM 添加到CMake include_directories 命令确实将包含路径设置为-isystem,如您所说,但这似乎不需要clang 或Xcode 使用。 好的,所以include_directories(SYSTEM) 实际上使用了-isystem 选项。 XCode 可能会向编译器添加一些其他参数,从而禁用警告抑制。但是如果没有看到构建可执行文件的完整命令行,就很难调试这个问题。 【参考方案1】:

CMake 解决方案

您可以通过

显式设置-isystem 标志
set(CMAKE_CXX_FLAGS "$CMAKE_CXX_FLAGS -isystem /path/to/system/header")

C++ 解决方案

您可以通过添加编译指示忽略系统标头中的警告

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-parameter"
#include <some/system/header.hpp> // warning ignored here
#pragma clang diagnostic pop
#include <myproject/header.hpp> // warning reported here

查看此答案了解更多详情:

https://***.com/a/18463996/2288008

注意:对于这两种情况,您都必须检查您是否使用了适当的编译器。例如。 -isystem 在 MSVC 中没有意义。

【讨论】:

CMake 选项似乎适用于嵌套在给定路径中的所有标题。使用 Xcode 7.0.1 在 OS X 10.10.5 上测试。【参考方案2】:

看起来答案是,“你不能”现在通过在 CMake 中使用 SYSTEM 来做到这一点。不过,上面解释的解决方法可以解决问题。

这个问题类似于CMake target_include_directories(SYSTEM ...): SYSTEM option does not seem to work on recent versions of CMake targeting Xcode

【讨论】:

以上是关于如何让 CMake 创建一个 xcode 项目,其中警告在系统标头中被抑制?的主要内容,如果未能解决你的问题,请参考以下文章

从 Cmake 创建 Xcode 项目包含不需要的编译器标志

CMake 生成带有本地化的 xcode 项目

我应该如何让 CMake 也为我的内核创建 PTX 文件

如何让自定义标签栏显示标签栏项目在 Xcode 中设置的选定图像?

(CMake杂记) —— 利用 CMake 创建项目的分组

(CMake杂记) —— 利用 CMake 创建项目的分组