Актуальное сообщение при запуске файла make в C - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть файл make с именем hello.

hello:
    cl hello.c

- его содержимое. У меня нет готового .exe-файла, и когда я набираю nmake hello, я получаю сообщение, что «hello» обновлен.

Ожидается вывод:

c nmake command prompt

По какой причине я не получаю ожидаемый результат? и как мне заставить его работать?

большое спасибо.

Ответы [ 2 ]

2 голосов
/ 06 февраля 2020

У меня нет существующего .exe готового

Это нормально, но ваша цель не называется hello.exe, она называется hello.

Наиболее вероятно, что nmake сообщает вам, что hello уже обновлен, потому что у вас есть файл hello в вашей папке. Либо переименуйте правило в hello.exe:

hello.exe:
    cl hello.c

, либо оставьте его как есть и удалите файл hello.

1 голос
/ 06 февраля 2020

В вашем MAKEFILE:

hello:
    cl hello.c

Правило для создания цели hello не имеет явных зависимостей и не соответствует никаким правилам вывода (см. Ниже). NMAKE будет воспринимать его как псевдо-цель . Поскольку он является псевдотаргетингом и не имеет зависимостей, он всегда считается актуальным, поэтому командный блок cl hello.c запускаться не будет.

В этом случае для создания файла .exe из один файл. c, вам не нужно явное правило, вы можете использовать встроенное в NMAKE .c.exe правило вывода (правило вывода - это специальное правило вида .from .to где от и до - это расширения имени файла):

# (You do not need to add this to your MAKEFILE. It is a built-in rule of NMAKE.)
.c.exe:
    $(CC) $(CFLAGS) $<

Макрос CC предопределен как cl и CFLAGS макрос не предопределен, поэтому он пуст. $< - это специальный макрос имени файла, который расширяется до зависимого файла с более поздней отметкой времени, чем цель. ($< допустимо только при использовании в правиле вывода.)

Попробуйте следующий MAKEFILE:

hello.exe:

Здесь hello.exe - первая цель в MAKEFILE, и поэтому это цель по умолчанию , которая будет построена.

Правило MAKEFILE для цели hello.exe не содержит командного блока, но поскольку файл hello.c существует, он соответствует встроенному в NMAKE. .c.exe правило вывода (как описано выше). При применении к цели hello.exe это правило вывода делает hello.c неявной зависимой от цели, и специальный макрос $< расширяется до этой неявной зависимой, то есть $< расширяется до hello.c. Поскольку $(CFLAGS) пусто, правило вывода приведет к выполнению следующей команды, когда зависимый hello.c новее, чем целевой hello.exe:

cl hello.c
...