【发布时间】:2015-07-30 11:22:25
【问题描述】:
我们正在构建一个依赖于 Boost 的应用程序,编译会在 Boost 标头 (tag_of.hpp) 中生成大量警告“无法重新声明类成员”。
为避免向构建日志发送垃圾邮件,我们决定将 Boost 标头作为系统标头包含在内:
target_include_directories(${PROJECT_NAME} SYSTEM PUBLIC ${Boost_INCLUDE_DIRS})
我们的理解是这个命令应该将 Boost 包含目录放在 -isystemcompiler 标志后面。然而它并没有这样做,而是将它放在标题搜索路径中的“正常”包含目录旁边。
环境为CMake 3.0.0,生成Xcode 5.1.1的工程文件。 这似乎是其他一些问题(请参阅this answer 中的最后两个 cmets)。
有没有一种工作方法可以将标头作为系统包含在内?
EDIT:刚刚在同一个环境下测试过,将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 -W括号 -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/Users/.../SDK/boost/include
......
【问题讨论】:
-
编译器是如何调用的?请粘贴
make VERBOSE=1(或Xcode等价物)的输出 -
@m.s.感谢您的建议。我发布了一个包含 Xcode 进行的编译器调用的新编辑,它是否相当于 make 中的
VERBOSE? -
您确定问题出在 cmake 而不是 Xcode 上吗? Xcode 是否支持
-isystem?我想不是。 Apple 错误跟踪器中还存在一个问题 -
@Francesco Xcode(在相当新的版本中[用 Xcode 5.1.1 测试])确实支持它,因为我可以手动使用它。
-
@AdN 您必须设置哪个变量?我想试一试