Что означает "$ <" при использовании в аргументе g++?

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

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

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

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

Другой сайт гласит, что:

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

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

Ответ 1

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

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

Основной функцией Makefile является создание target, если изменяется зависимость:

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

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

Это похоже на то, что это было (не действительный Makefile):

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

То, как я их помню, @ напоминает цель (как в целевой практике), а < напоминает стрелку. Поэтому я представляю себе стрелку, указывающую на цель:

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

YMMV

Ответ 2

Это один из GNU делает автоматические переменные.

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

Необходимым условием является файл, указанный в rule:

targets : prerequisites
        recipe

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

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

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

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

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