2011-11-02 15 views
5

Obecnie próbuję uzyskać program do kompilacji w systemie, nad którym nie mam kontroli.Zastąp domyślną ścieżkę wyszukiwania nagłówka

Problem, który mam jest katalogi zawierające wyglądać następująco:

/usr/include: 
gmpxx.h gmp.h 

/usr/local/include: 
gmp.h 

W moim pliku cpp, używam

#include <gmpxx.h> 

a to znajdzie poprawny plik w /usr/include jednak gdy gmpxx.h zawiera gmp.h, pobiera go z /usr/local/include, co powoduje przerwanie kompilacji.

Teraz widzę 3 bardzo brzydkie rozwiązania problemu

  1. W moim pliku cpp, dodać #include </usr/include/gmp.h>
    Mając absolutną zawierać ścieżka jest dość brzydki i nie-przenośny, i myślę, że ten coś powinno należeć do Makefile zamiast do źródła.

  2. dodać flagę -nostdinc do mojego makefile i określić ścieżki zawierają ręcznie

  3. tworzyć lokalne dowiązania do bibliotek, które naprawdę chcą, a następnie wykonaj lokalny obejmuje (#include "gmp.h")

Czy istnieje lepsze rozwiązanie, którego mi brakuje?

+0

Czy wolno modyfikować gmpxx.h? –

+0

Nie jestem, jedyne co mogę zmienić to pliki lokalne (cpp, makefile) – cobbal

+0

# 2 ma dużo sensu. Makefile pokazuje, jak skompilować plik. Pozostałe dwa wydają się hackish. –

Odpowiedz

12

ścieżki Poszukiwanie zawiera są w następującej kolejności:

Można więc użyć jednego z dwóch pierwszych (w zależności od tego, który z nich wydaje się lepszy/wygodniejszy dla twoich celów).

+0

Nie próbowałem CPLUS_INCLUDE_PATH, ale problem z -I jest taki, że jeśli dasz mu katalog w standardowych wartościach domyślnych, ignoruje on kolejność i nie umieszcza go jako pierwszego. – cobbal

+0

@cobbal: Rozumiem, co mówisz; tak, jest to wspomniane w dokumentacji, z którą się łączyłem. Wymienia dwa obejścia: '-nostdinc' (o którym już wiesz i jest brzydki - o czym się z tobą zgadzam) i' -isystem' (zobacz http://gc.gnu.org/onlinedocs/ gcc-4.3.2 // gcc/Preprocessor-Options.html). – ruakh

+0

Wygląda na to, że CPLUS_INCLUDE_PATH było dokładnie tym, co było potrzebne. Dzięki – cobbal

0

Usuń gmp.h z/usr/local/include lub dowiedz się, dlaczego masz dystrybucję oprogramowania, która chce mieć gmp.h w katalogu/usr/local/include i usunąć dystrybucję. Myślę, że przyczyną problemu jest posiadanie z jakiegoś powodu dwóch konfliktowych zestawów plików nagłówkowych dla GMP. Jeśli masz standardową instalację plików rozwojowych GMP w swoim systemie (/ usr/include/...), nie powinno być żadnego powodu, aby mieć inny zestaw nagłówków w/usr/local/include /.

Nie ma czysty sposób to naprawić inaczej, ponieważ należy uwzględnić gmpxx.h za pomocą kątowników

#include <gmpxx.h> 

jak ty. Teraz gmpxx.h zawiera również gmp.h używając nawiasów trójkątnych, a na twoim systemie/usr/local/include ma pierwszeństwo nad/usr/include, co ma sens.

Więc polecam Ci dowiedzieć się, dlaczego istnieją dwie gmp.h i usunąć fałszywe. W ustawieniach plików nagłówkowych jest coś podejrzanego.

Nie można łatwo przetasować/usr/include i/usr/local/include, ponieważ są one uważane za katalogi systemowe i jeśli spróbujesz użyć -I na nich, GCC zignoruje opcję.

+1

Chociaż byłoby to z pewnością idealne, nie mogę zmodyfikować nagłówków, ponieważ jest to szkolna maszyna. Ponieważ nie mogę tego zrobić, idę z najczystszym obejściem. – cobbal

+0

LOL dobre uzasadnienie :) –

Powiązane problemy