覆盖默认标题搜索路径

Posted

技术标签:

【中文标题】覆盖默认标题搜索路径【英文标题】:Override default header search path 【发布时间】:2011-11-02 23:12:19 【问题描述】:

我目前正在尝试让一个程序在我无法控制的系统上编译。

我遇到的问题是包含目录如下所示:

/usr/include:
gmpxx.h gmp.h

/usr/local/include:
gmp.h

在我的 cpp 文件中,我使用

#include <gmpxx.h>

这会在 /usr/include 中找到正确的文件,但是当 gmpxx.h 包含 gmp.h 时,它会从 /usr/local/include 中提取它,这会破坏构建。

现在,我看到了 3 个非常丑陋的解决方案

    在我的cpp文件中,添加#include &lt;/usr/include/gmp.h&gt; 拥有一个绝对包含路径非常丑陋且不可移植,我认为这种东西应该属于 Makefile 而不是源代码。

    -nostdinc 标志添加到我的makefile,并手动指定包含路径

    为我真正想要的库创建本地符号链接,然后执行本地包含 (#include "gmp.h")

有没有更好的解决方案我错过了?

【问题讨论】:

你可以修改gmpxx.h吗? 我不是,我唯一能改变的就是本地文件(cpp、makefile) #2 很有意义。 Makefile 显示了如何构建文件。其他两个看起来很老套。 @JoeMcGrath #2 的问题是默认值包括一些看似神奇的目录,例如“/usr/include/c++/3.4.6”,我必须用 -I 添加回来标志 【参考方案1】:

包含的搜索路径按以下顺序进行:

The -I command-line option. The CPLUS_INCLUDE_PATH environment variable. 标准默认值。

因此,您可以使用前两个中的任何一个(以您的目的看起来更好/更方便)。

【讨论】:

我没有尝试过 CPLUS_INCLUDE_PATH,但是 -I 的问题是,如果你给它一个标准默认值的目录,它会忽略顺序并且不会把它放在第一位。 @cobbal:我明白你在说什么;是的,我链接到的文档中提到了这一点。它提到了两种解决方法:-nostdinc(你已经知道,并且觉得丑陋——我同意你的观点)和-isystem(见gcc.gnu.org/onlinedocs/gcc-4.3.2//gcc/Preprocessor-Options.html)。 看来 CPLUS_INCLUDE_PATH 正是我们所需要的。谢谢【参考方案2】:

从 /usr/local/include 中删除 gmp.h,或者找出为什么您的软件发行版希望在 /usr/local/include 中包含 gmp.h 并删除该发行版。我认为问题是由于出于某种原因您有两个冲突的 GMP 头文件集。如果您在系统上安装了标准的 GMP 开发文件(/usr/include/...),则不应有理由在 /usr/local/include/ 中设置另一组标头。

否则没有干净的方法可以解决它,因为您应该使用尖括号包含 gmpxx.h

#include <gmpxx.h>

如你所愿。现在 gmpxx.h 也使用尖括号包含 gmp.h,并且在您的系统上 /usr/local/include 优先于 /usr/include,这是有道理的。

所以我建议你弄清楚为什么有两个 gmp.h 并删除虚假的。你的头文件设置有问题。

您不能轻易地重新排列 /usr/include 和 /usr/local/include 因为它们被视为系统包含目录,如果您尝试在它们上使用 -I,GCC 将忽略该选项。

【讨论】:

虽然这肯定是理想的,但我不能真正修改标题,因为它是一台学校机器。由于我无法做到这一点,因此我将采用最干净的解决方法。

以上是关于覆盖默认标题搜索路径的主要内容,如果未能解决你的问题,请参考以下文章

Sonarqube 默认覆盖范围为 0,来自具有绝对路径的 Karma Coverage LCOV 文件

如何在matlab默认搜索路径中添加文件

为啥`/usr/include`不在gcc默认搜索路径中

如何在 Windows 上确定 php.exe 的路径 - 搜索默认路径

快速覆盖 UIView 中的默认图层类型

linux下编译时的默认库和头文件搜索路径