覆盖默认标题搜索路径
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 </usr/include/gmp.h>
拥有一个绝对包含路径非常丑陋且不可移植,我认为这种东西应该属于 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 文件