我目前正在尝试在一个我无法控制的系统上编译程序。
我遇到的问题是包含目录如下:
/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"
)
我缺少一个更好的解决方案吗?
答案 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将忽略该选项。