2016-10-08 16 views
10

Używam biblioteki, która ma przykładową aplikację. Próbka makefile zawiera $< w argumentach:

all:test.cpp 
    g++ -Wl,--no-as-needed -o Example $< 
clean: 
    rm -f SampleApp11 

Szukałem tego i tutorialspoint że

$ < nazwę powiązanego pliku, który spowodował działania.

Kolejne website stwierdza, że:

jest to reguła wymiana przyrostek na budowę .o jest z .c na używa zmiennych automatycznych $ <: nazwę przesłanki reguły (a. c plik) i $ @: nazwa celu reguły (plik .o) (patrz sekcja podręcznika gnu make o zmiennych automatycznych) .co: $ (CC) $ (CFLAGS) $ (ZAWIERA) -c $ < -o $ @

Wciąż jestem zdezorientowany, co to oznacza?

+0

W twoim przykładzie jest to ** zależność (plik) po 'all:' cel - 'test.cpp'. – Galik

+0

Ahh, więc '<$' mówi g ++, który plik do skompilowania, czy to prawda? –

+12

Pamiętaj, że nie ma to nic wspólnego z g ++. To make, który zastępuje to przed wywołaniem g ++. g ++ nigdy nie widzi '$ <'. Jeśli tak, to potraktuje to jako nazwę pliku i prawdopodobnie wyda komunikat o błędzie, że żaden plik nie zostanie odnaleziony. – hvd

Odpowiedz

16

To właściwie nie ma nic wspólnego z kompilatorem, jego częścią składową Makefile i jest zastępowany przed uruchomieniem kompilatora.

W przykładzie jest to pierwszy zależność (plik) po tarczy all: - test.cpp.

Podstawową funkcją Makefile jest stworzenie celu jeśli A zależność zmianami:

target: dependency.cpp 
    rule to create target (using dependency.cpp) 

Zazwyczaj $< jest wejście kompilator i [email protected] jest wyjście.

To trochę tak, jakby był to (nie ważne Makefile):

[email protected]: $< 
    g++ -o [email protected] $< 

Sposób, w jaki je zapamiętać jest @ podobny cel (jak w praktyce cel) i < przypomina strzałę. Więc wyobrazić sobie strzałka wskazując na cel:

@ <-------- (think "Robin Hood") 

YMMV

9

Jest to jeden z GNU make's automatic variables.

Nazwa pierwszego wymagania wstępnego. Jeśli cel uzyskał swoją recepturę z niejawnej reguły, będzie to pierwsze wymaganie wstępne dodane przez niejawną regułę (patrz Implicit Rules).

Warunkiem jest plikiem wymienione w rule:

targets : prerequisites 
     recipe 

Na przykład w następującej reguły pierwszym warunkiem jest test.c plików

my_executable: test.c precompiled.o 
    g++ -o my_executable $< 

Jest to równowartość :

my_executable: test.c precompiled.o 
    g++ -o my_executable test.c 

Kolejnym warunkiem wstępnym jest precompiled.o (sugerowany wstępnie skompilowany plik obiektowy).