使用-isystem代替-I和CMake

JRM*_*JRM 48 gcc build cmake

在使用gcc构建时,CMake中是否有任何方法强制通过include_directories(或者可能通过不同的函数)指定的路径使用-isystem标志而不是-I标志?

有关-I和-isystem的详细信息,请参阅http://gcc.gnu.org/onlinedocs/gcc/Directory-Options.html#Directory-Options.

Rob*_*ard 61

是的,您通过使用可选的SYSTEM标志强制路径成为系统包含

include_directories(SYSTEM path)
Run Code Online (Sandbox Code Playgroud)

http://www.cmake.org/cmake/help/cmake-2-8-docs.html#command:include_directories

从CMake 2.8.12开始,您可以使用新的target_include_directories在目标级别包含系统目录,同时利用cmake的新使用要求功能:

target_include_directories(foo SYSTEM PUBLIC path)
Run Code Online (Sandbox Code Playgroud)

现在,目标foo将使用路径作为系统包含,并且链接到foo的任何内容也将自动使用路径作为系统包含.您可以通过将PUBLIC关键字更改为PRIVATE或INTERFACE来控制这些使用要求的传播.

http://cmake.org/cmake/help/v2.8.12/cmake.html#command:target_include_directories

  • 对我来说,这不适用于MAC OS 10.8,cmake 2.8.1:直到我在`INCLUDE_DIRECTORIES`指令之前使用`CMAKE_INCLUDE_SYSTEM_FLAG_CXX ="isystem"`. (5认同)
  • 在带有CMake 3.1的OS X上,由于某种原因,这与`include_directories`一起使用,但不与`target_include_directories`一起使用. (2认同)

ide*_*n42 10

如前所述,包含系统路径的正确方法是:

include_directories(SYSTEM path1 path2)<br>
Run Code Online (Sandbox Code Playgroud)

但是从CMake 2.8.4和Makefiles开始,这只用于C++而不是C,我查看它并且GNU.cmake没有初始化: CMAKE_INCLUDE_SYSTEM_FLAG_C

所以你可以在打电话后自己设置project().

if(CMAKE_COMPILER_IS_GNUCC)
  set(CMAKE_INCLUDE_SYSTEM_FLAG_C "-isystem ")
endif()

更新:

CMake开发人员已经在2.8.5中解决了这个问题