覆盖默认标头搜索路径

时间:2011-11-02 23:12:20

标签: c++ gcc

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

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

/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个非常难看的问题解决方案

  1. 在我的cpp文件中,添加#include </usr/include/gmp.h>
    拥有绝对包含路径是相当丑陋和不可移植的,我认为这种事情应该属于Makefile而不是源。

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

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

  4. 我缺少一个更好的解决方案吗?

2 个答案:

答案 0 :(得分:13)

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

所以,您可以使用前两个中的任何一个(无论哪个更好/更方便您的目的)。

答案 1 :(得分:0)

从/ 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将忽略该选项。