【问题标题】:How can I force cmake to use C++ header files in /usr/include in Linux?如何强制 cmake 在 Linux 的 /usr/include 中使用 C++ 头文件?
【发布时间】:2015-08-14 19:54:07
【问题描述】:

我有一个使用安装在/usr/include 中的标头的cmake 项目,我们称之为freeglut.h。当我使用find_package(GLUT) 时,我得到${GLUT_INCLUDE_DIR} 指向/usr/include。一切顺利。

现在,我要添加 CUDA,它将这些和其他标头的自己的副本保存在 find_package(CUDA) 包含的路径之一中。通常我会通过在include_directories() 中将${GLUT_INCLUDE_DIR} 放在${CUDA_INCLUDE_DIRS} 之前来解决这个问题。但是,在 Unix 系统上,cmake 在UnixPaths.cmake 中维护一个名为CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIESlist,其中包含/usr/include,并且显然阻止cmake 为目录/usr/include 的编译器发出-I<dir> 参数,这意味着编译器首先搜索 CUDA 路径,并使用在那里找到的 freeglut.h 标头。

我曾尝试使用list(REMOVE_ITEM ...CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES 列表中删除/usr/include,但这并没有改变cmake 生成的编译器命令。

我当然可以开始修改 CUDA 安装,删除我不想要的头文件,或者修改 CUDA_INCLUDE_DIRS 变量,但是有没有一种干净的方法告诉 cmake 首先使用系统头文件,如果它们存在吗?

【问题讨论】:

  • @Olaf 您删除了 C 标签,但这个问题几乎完全适用于 C 以及 C++。
  • “我怎样才能强制 cmake 使用 C++ 头文件...”很清楚。而“几乎完全”就像“有点怀孕”。
  • 本题与适用于 C 题的汉明距离为 4 个字符。删除标题中的 ++ 和 CMAKE_CXX... 变量中的 XX。这是您可以问自己的一个测试:如果通过这两个更改重新提交了这个问题,您会说“哇,这是一个很棒的独立问题”,还是只是让提问者(希望)参考这个问题的解决方案?我反问。很明显。
  • 够搞笑了,即使单个位翻转,如果没有冗余,数据也没用。但是与那些认为“相同的首字母 ==(几乎)相同的语言”的人讨论几乎没有什么可取之处。我建议添加 B 和 D 标签。 这些的汉明距离确实为 1。顺便说一句:“C 和“C++”不能比较:不同的长度。如果用 0 填充,它仍然要大得多 - 二进制表示。不要开始战斗你赢不了。
  • 我在这里唯一的一点是,这是一个关于 cmake 生成具有特定头搜索路径顺序的编译器命令的问题。如果您查看UnixPaths.cmake,您会发现相同的机制适用于 C 和 C++ 语言,如果您查看 gnu 编译器套件文档,您会看到 gcc 之间的头文件搜索路径行为相同和g++。问题是相同的,人们希望两种语言的解决方案是相同的。 cmake 中没有硬编码排除 B 或 D 或 Fortran 的系统路径,所以我没有标记这些语言。

标签: c++ c linux cmake


【解决方案1】:

我想-idirafter 标志应该可以帮助你:

-idirafter 目录

在 dir 中搜索头文件,但在所有用 -I 指定的目录和标准系统目录都有 已经筋疲力尽了。 dir 被视为系统包含目录。

https://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html

您可以像这样使用它来降低 CUDA 包含目录的优先级:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -idirafter /usr/include/<CUDA_includes>")

【讨论】:

    猜你喜欢
    • 2015-01-17
    • 2013-12-27
    • 2012-05-16
    • 1970-01-01
    • 1970-01-01
    • 2016-07-31
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    相关资源
    最近更新 更多