Rozumiem, że CFLAGS (lub CXXFLAGS dla C ++) są dla kompilatora, podczas gdy CPPFLAGS jest używany przez preprocesor.
Ale nadal nie rozumiem różnicy.
Muszę określić ścieżkę dołączania do pliku nagłówkowego, który jest zawarty w #include - ponieważ #include jest dyrektywą preprocesora, czy preprocesor (CPPFLAGS) jest jedyną rzeczą, na której mi zależy?
W jakich okolicznościach muszę udostępnić kompilatorowi dodatkową ścieżkę dołączania?
Ogólnie, jeśli preprocesor znajduje i dołącza potrzebne pliki nagłówkowe, dlaczego kiedykolwiek trzeba mu informować o dodatkowych katalogach dołączania? Jakie w ogóle zastosowanie ma CFLAGS?
(W moim przypadku stwierdziłem, że OBIE z nich pozwalają mi skompilować program, co pogłębia zamieszanie ... Mogę użyć CFLAGS LUB CPPFLAGS, aby osiągnąć mój cel (przynajmniej w kontekście autoconf). Co daje?)
Odpowiedzi:
Niejawna reguła make do kompilowania programu w C to
gdzie
$()
składnia rozszerza zmienne. Ponieważ obaCPPFLAGS
iCFLAGS
są używane w wywołaniu kompilatora, którego używasz do definiowania ścieżek dołączania, jest kwestią osobistego gustu. Na przykład, jeślifoo.c
jest to plik w bieżącym kataloguoba będą wywoływać Twój kompilator dokładnie w ten sam sposób, mianowicie
Różnica pomiędzy tymi dwoma wchodzi w grę, gdy masz wiele języków, które muszą zawierać te same ścieżki, na przykład, jeśli
bar.cpp
następnie spróbujwtedy będą kompilacje
ponieważ niejawna reguła C ++ również używa tej
CPPFLAGS
zmiennej.Różnica ta daje instrukcji dobre dla którego można używać - jeśli chcesz flagi do wykorzystania dla wszystkich języków umieścić go
CPPFLAGS
, jeśli jest to dla języka określonego umieścić go wCFLAGS
,CXXFLAGS
itd. Przykłady tego ostatniego typu zawierają standardowe zgodności lub flagi ostrzegawcze - nie chciałbyś przejść-std=c99
do swojego kompilatora C ++!Możesz wtedy otrzymać coś takiego w swoim pliku makefile
źródło
cpp
użyciuCPPFLAGS
i oczekiwać żadnego rozsądnego rezultatu, ponieważ-std=c99
wpływa na której są zdefiniowane symbole (zwłaszcza zamiast makr testowych funkcja). Zamiast tego potrzebujesz$(CC) $(CPPFLAGS) $(CFLAGS) -E
.To
CPPFLAGS
makro służy do określania#include
katalogów.Oba
CPPFLAGS
iCFLAGS
działają w twoim przypadku, ponieważmake
reguła (1) łączy przetwarzanie wstępne i kompilację w jednym poleceniu (więc oba makra są używane w poleceniu)..
Jeśli używasz formularza, nie musisz określać jako katalogu dołączonego#include "..."
. Nie musisz też określać katalogu dołączania standardowego kompilatora. Musisz określić wszystkie inne katalogi nagłówkowe.źródło
gcc -E
na pliku - nie ma #includes). Większość nowoczesnych kompilatorów łączy etapy przetwarzania wstępnego i kompilacji, więc nie musisz się tym martwić.Szukasz ukrytych reguł tworzenia .
źródło
Aby dodać do tych, którzy wspomnieli o niejawnych regułach, najlepiej sprawdzić, co marka zdefiniowała niejawnie i dla twojego środowiska, używając:
Na przykład:
który się rozszerza
Spowoduje to również wydrukowanie
# environment
danych. Tutaj znajdziesz ścieżkę dołączania GCC, wśród innych przydatnych informacji.W rezultacie, jeśli chodzi o wyszukiwanie, ścieżek jest wiele, światło jest jedno ... lub coś w tym rodzaju.
C_INCLUDE_PATH
jest ogólnosystemowy, ustaw go w powłoce*.rc
.$(CPPFLAGS)
jest dla ścieżki dołączania preprocesora.... a nawet bardziej szczegółowe
make używa VPATH jako ogólnej ścieżki wyszukiwania, więc używaj jej ostrożnie. Jeśli plik istnieje w więcej niż jednej lokalizacji wymienionej w VPATH, make zajmie się pierwszym wystąpieniem na liście.
źródło