我们正在构建一个依赖于Boost的应用程序,并且编译会在Boost标头(tag_of.hpp)中生成大量警告“类成员无法重新声明”。
为了避免垃圾邮件构建日志,我们决定将Boost标头包含为系统标头:
target_include_directories(${PROJECT_NAME} SYSTEM PUBLIC ${Boost_INCLUDE_DIRS})
我们的理解是这个命令应该将Boost包含目录放在-isystem
编译器标志后面。但它没有这样的东西,而是将它与标题搜索路径中的“普通”包含目录放在一起。
环境 CMake 3.0.0 ,为 Xcode 5.1.1 生成项目文件。 这似乎是其他一些问题(参见this answer中的最后两条评论)。
有没有一种方法可以将标题包含在系统中?
编辑:刚刚在同一环境中测试过,将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})
从此脚本生成的Xcode项目文件将构建设置中的Boost路径放置为:标头搜索路径,而不是将其附加到-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-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-扩展-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-sign-conversion -I / Users /.../ system_dependencies / build / Debug / include
-I /用户/.../ SDK /升压/包含
...
答案 0 :(得分:4)
这个问题看起来只发生在XCode生成器上,因为CMake认为它不支持isystem标志。我认为最好的解决方案是在CMake bug跟踪器上报告此问题。