2010-07-02 10 views
12

Używam prekompilowanych nagłówków GCC w moim projekcie z kompilacją wielu architektur, ale rzeczy się psują, gdy próbuję umieścić je w katalogu innym niż katalog bieżącego źródła.Jak sprawić, aby GCC szukało nagłówków w katalogu przed katalogiem bieżącego pliku źródłowego?

Plik jest zawarty w podwójnych cudzysłowach i działa, jeśli zmienię go na nawiasy kątowe, ale problem polega na tym, że mam wiele innych projektów, które używają tej samej prekompilowanej nazwy nagłówka, więc zmieniając wszystkie pod kątem pod kątem nawiasy nie są pożądane, ponieważ mogą powodować niejednoznaczność nagłówka, który należy uwzględnić w kompilacji Visual Studio tych samych plików.

GCC searches current directory for double-quote includes before its search path. Mogę obejść go przy użyciu opcji -I- (na przykład -Ipch_dir.i686 -I-), aby wstępnie skompilowany katalog nagłówków był przeszukiwany przed bieżącym katalogiem, ale ta opcja jest nieaktualna. GCC sugeruje użycie -iquote, ale nie ma takiego samego efektu jak -I-.

Pytanie brzmi: jak mogę to zrobić bez zmiany wszystkich prekompilowanych nagłówków to dyrektywy do nawiasów ostrych i użycie przestarzałego przełącznika GCC?

+0

Co jest złego w przypadku posiadania jednego zestawu wstępnie skompilowanych nagłówków w jednym miejscu, które są używane w projektach? Czy zmiana nazwy prekompilowanego nagłówka, jeśli musi być unikalna dla twojego projektu? –

+0

@Owen S. Chciałbym uniknąć wprowadzania istotnych zmian w globalnej strukturze projektu/systemie budowy. –

Odpowiedz

10

Znalazłem obejście.

  1. Utwórz skompilowany nagłówek pod inną nazwą. Na przykład jest nagłówek jest a.h, oryginalne prekompilowany nagłówek jest pchdir.i686/a.h.gch, budować go jako

    gcc a.h -o pchdir.i686/a-precompiled.h.gch 
    
  2. -include przełącznik
  3. przeznaczenie GCC do upewnij się, że zmieniono nazwę nagłówka jest wliczone przed cokolwiek innego (nawet przed pierwotnym a.h), na przykład

    gcc -Ipchdir.i686 -include a-precompiled.h <other arguments> <source> 
    
  4. Ostateczna kolejność włączenia w pliku źródłowym będą: a-precompiled.h.gch, a.h, które zostały sprawdzone z -H. Oryginalny nagłówek jest zawarty, ale nie jest przetwarzany, ponieważ prekompilowany nagłówek ma identyczne osłony (weryfikowane również poprzez wstawienie #error w oryginalnym nagłówku po zbudowaniu prekompilowanego).

+1

+1 @alex nice, Występuje podobny problem, gdy chcę, aby gcc szukał pliku pch w innym katalogu niż lokalizacja nagłówka. Dam ci obejście problemu i mam nadzieję, że zadziała. Coś, co naprawdę mnie irytuje na temat gcc, to dlaczego nie ułatwiają korzystania z funkcji pch? Uważam, że programista/użytkownik zbyt często musi się bawić przy ustawieniach narzędzi, o które naprawdę nie powinniśmy się martwić. Mam na myśli, że powinno po prostu "pracować". – greatwolf

+1

+1 @alex. Dzięki za udostępnienie rozwiązania, pomógł mi również. Po prostu zwróć uwagę, że możesz go znacznie uprościć: nie musisz zmieniać prekompilowanych danych wyjściowych i dodawać ich folderu do załączników. Po wygenerowaniu prekompilowanych danych wyjściowych w folderze zależnym od konfiguracji użyj -include z unikalną ścieżką, a nie tylko nazwą. W twoim przypadku: 'gcc -include pchdir.i686/a.h ...' jest wszystkim czego potrzebujesz. (działa na os x klang) – zzz

Powiązane problemy