【问题标题】:Use -isystem instead of -I with CMake在 CMake 中使用 -isystem 而不是 -I
【发布时间】:2011-03-23 05:12:36
【问题描述】:

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

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

【问题讨论】:

  • 嗨。我从 8 年后来到这里。奇怪的是,现在 cmake 对 isystem 的使用,加上 include_next,破坏了很多构建,尤其是交叉构建。
  • 关于@donbright 所说的,考虑访问这个问题:stackoverflow.com/q/37218953/1233251

标签: gcc build cmake


【解决方案1】:

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

include_directories(SYSTEM path)

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)

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

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

【讨论】:

  • 命令应该是include_directories,前面不带set_
  • 对我来说,这在 MAC OS 10.8、cmake 2.8.1 上不起作用:直到我在 INCLUDE_DIRECTORIES 指令之前使用了 CMAKE_INCLUDE_SYSTEM_FLAG_CXX="isystem"
  • @math 你试过将 cmake 升级到更新的版本吗? 2.8.1 已经好几年了。
  • 在带有 CMake 3.1 的 OS X 上,由于某种原因,这适用于 include_directories,但不适用于 target_include_directories
  • 在带有 CMake 3.2.2 的 OS X 上,这不适用于 include_directories,也不适用于 target_include_directories,设置 CMAKE_INCLUDE_SYSTEM_FLAG_CXX 在这两种情况下都无济于事。
【解决方案2】:

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

include_directories(SYSTEM path1 path2)

但是从 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 中修复此问题

【讨论】:

  • 是的,它已在 2.8.5 中修复。这是带有修复的提交:cmake.org/…
【解决方案3】:

您可以尝试使用CMAKE_C_FLAGSCMAKE_CXX_FLAGS 添加其他标志。

【讨论】:

  • 虽然您可以使用 CMAKE_C/CXX_FLAGS 添加包含这并不是真正有用,但 CMake 有添加包含的方法,通常您希望使用这些方法。
  • 您应该始终远离CMAKE_CXX_FLAGSCMAKE_C_FLAGS。有target_compile_options可以加flag。
猜你喜欢
  • 1970-01-01
  • 2018-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-24
  • 1970-01-01
  • 2012-09-02
  • 1970-01-01
相关资源
最近更新 更多