2011-11-02 169 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好理由:) –