2011-11-02 159 views
5

我目前正试图让一个程序在我无法控制的系统上编译。覆盖默认标题搜索路径

说我遇到的问题是包含目录是这样的:

/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,并手动指定include路径

  3. 创建本地符号链接,我真的想库,然后做局部包括(#include "gmp.h"

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

+0

是否允许修改gmpxx.h? –

+0

我不是,唯一能改变的就是本地文件(cpp,makefile) – cobbal

+0

#2有很大的意义。 Makefile显示了如何构建文件。另外两个人似乎很讨厌。 –

回答

12

搜索路径为包括采取按照下列顺序:

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

+0

我还没有尝试过CPLUS_INCLUDE_PATH,但是-I的问题在于,如果您在标准默认值中给它一个目录,它将忽略该顺序并且不会将其置于第一位。 – cobbal

+0

@cobbal:我明白你在说什么了;是的,这在我链接到的文档中提到。它提到了两种解决方法:'-nostdinc'(你已经知道,并且发现丑陋 - 我同意你的意见)和'-isystem'(参见http://gcc.gnu.org/onlinedocs/ gcc-4.3.2 // gcc/Preprocessor-Options.html)。 – ruakh

+0

看来CPLUS_INCLUDE_PATH正是需要的。谢谢 – cobbal

0

从/ usr/local/include中删除gmp.h,或者找出为什么你有一个希望在/ usr/local/include中包含gmp.h并删除分发的软件分发。我认为这个问题是由于GMP出于某种原因导致两个相互矛盾的头文件集引起的。如果您的系统上安装了标准的GMP开发文件(/ usr/include/...),那么不应该在/ usr/local/include /中另有一组标头。

有没有干净的方式,否则修复它,因为你应该使用尖括号

#include <gmpxx.h> 

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

所以我建议你弄清楚为什么有两个gmp.h并删除了伪造的。头文件设置中有些东西是可疑的。

你不能轻易地对/ usr/include和/ usr/local/include进行重新渲染,因为它们被认为是系统包含目录,如果你尝试在它们上面使用-I,GCC将忽略这个选项。

+1

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

+0

LOL好理由:) –