CMake target_include_directories(SYSTEM ...): SYSTEM 选项似乎不适用于针对 Xcode 的最新版本的 CMake

Ad *_*d N 4 c++ xcode cmake include

我们正在构建一个依赖于 Boost 的应用程序,编译在 Boost 头文件 (tag_of.hpp) 中生成大量警告“不能重新声明类成员”

为了避免垃圾邮件构建日志,我们决定将 Boost 标头作为系统标头包含在内:

target_include_directories(${PROJECT_NAME} SYSTEM PUBLIC ${Boost_INCLUDE_DIRS})
Run Code Online (Sandbox Code Playgroud)

我们的理解是该命令应该将 Boost 包含目录放在-isystem编译器标志后面。然而,它没有做这样的事情,而是将它放在标题搜索路径中的“正常”包含目录旁边。

环境为CMake 3.0.0,为Xcode 5.1.1生成项目文件。这似乎是其他一些人的问题(请参阅此答案中的最后两条评论)。

有没有一种工作方法可以将标题作为系统包含在内?


编辑:刚刚在相同的环境中测试,将 CMake 更新到版本3.3.0,行为是相同的。


编辑:这是一个最小的例子,它显示了我的环境中的问题

cmake_minimum_required(VERSION 3.0)

find_package(Boost 1.49 COMPONENTS)

project(system_dependencies)

add_executable(${PROJECT_NAME} main.cpp)

target_include_directories(${PROJECT_NAME} SYSTEM PUBLIC ${Boost_INCLUDE_DIRS})
Run Code Online (Sandbox Code Playgroud)

从此脚本生成的 Xcode 项目文件将 Boost 的路径放在构建设置中:Header search path,而不是将其附加在-isystem编译器标志后面。IDE发出的编译命令证实了这一点:

/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 -未初始化 -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.9.sdk -fasm-blocks -fstrict-aliasing -Wdeprecated-declarations -Winvalid-offsetof -mmacosx-version-min=10.9 -g -Wno-符号转换 -I/Users/.../system_dependencies/build/Debug/include

-I/Users/.../SDK/boost/include

......

Rob*_*ard 5

这个问题看起来只发生在 XCode 生成器上,因为 CMake 认为它不支持 isystem 标志。我认为最好的解决方案是在 CMake 错误跟踪器上报告这个问题。