2016-10-08 4 views
10

Я использую библиотеку с образцом приложения. Образец Makefile содержит в аргументах $<:

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

Я смотрел это и tutorialspoint сказать, что

< $ имя соответствующего файла, вызвавшего действие.

Еще website гласит, что:

это правило замены суффикса для построения .o от .c-х он использует автоматические переменные $ <: имя предпосылку правилу (а. c файл) и $ @: имя цели правила (файл .o) (см. раздел руководства gnu о автоматических переменных) .co: $ (CC) $ (CFLAGS) $ (ВКЛЮЧАЕТ) -c $ < -o $ @

Я все еще смущен, что это значит?

+0

В вашем примере это ** первая ** зависимость (файл) после 'all:' target - 'test.cpp'. – Galik

+0

Ahh, поэтому '<$' сообщает g ++, какой файл компилировать, это правильно? –

+12

Обратите внимание, что это не имеет ничего общего с g ++. Это make, который заменяет это перед вызовом g ++. g ++ никогда не видит '$ <'. Если бы это было так, это относилось бы к нему как к имени файла и, вероятно, выдает сообщение об ошибке об отсутствии файла по этому имени. – hvd

ответ

16

Это не имеет никакого отношения к компилятору, его части синтаксиса Makefile и заменяется перед запуском компилятора.

В вашем примере это первая зависимость (файл) после all: цели - test.cpp.

Основная функция Makefile заключается в создании цели Если в зависимости изменений:

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

Обычно $< является входа в компилятор и [email protected] является выходом.

Это своего рода, как если бы это было так (не действительный Makefile):

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

Насколько я помню их это @ напоминает мишень (как в стрельбах) и < напоминает стрелу. Так что я вообразить стрелка наведение на цель :

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

YMMV

9

Это один из GNU make's automatic variables.

Название первого предпосылки. Если цель получила свой рецепт от неявного правила, это будет первое предварительное условие, добавленное неявным правилом (см. Implicit Rules).

Предпосылкой файл указан в rule:

targets : prerequisites 
     recipe 

Например, в следующем правиле первым условием является test.c файла:

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

Это эквивалентно следующему :

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

И precompiled.o является вторым предварительным условием (подразумевается прекомпилированный объектный файл).