У меня есть make-файл, который может скомпилировать и сразу запустить 3 программы c. Команда make all отлично работает, но make unpack и make remove приводят к

make: 'unpack' обновлен

(и то же самое с make remove).

Примечание (резюме из комментария):
Это нормально - всегда компилировать (даже если это не нужно для обновления) и выполнять. Моя проблема в том, что он не всегда выполняет программу.

Ниже мой код:

all: assign4.c
    gcc assign4.c
    ./a.out output.tar test1.txt test2.txt testDir
    @echo "\n\n~~~~~output.tar created~~~~~\n-Use 'make remove' to remove test files\n-Use 'make unpack' to restore test files from output.tar\n\n"

unpack: unpack.c
    gcc unpack.c -o unpack
    ./unpack

remove: removeTestFiles.c
    gcc removeTestFiles.c -o remove
    ./remove

Я также пробовал использовать .PHONY вот так:

all: assign4.c
    gcc assign4.c
    ./a.out output.tar test1.txt test2.txt testDir
    @echo "\n\n~~~~~output.tar created~~~~~\n-Use 'make remove' to remove test files\n-Use 'make unpack' to restore test files from output.tar\n\n"


#.PHONY: unpack
unpack: unpack.c
    gcc unpack.c -o unpack
    .PHONY : ./unpack

.PHONY: remove
remove: removeTestFiles.c
    gcc removeTestFiles.c -o remove
    ./remove

Но по какой-то причине я получаю сообщение об ошибке, когда запускаю make unpack, который говорит make: .PHONY: Command not found, что не имеет никакого смысла, потому что я закомментировал этот .phony, но оставил фальшивый файл удаленным и {{X2} } работает отлично ...

1
tom44 8 Мар 2018 в 09:30

1 ответ

Лучший ответ

Это всегда будет выполнять распаковку, даже если она обычно считается актуальной:

.PHONY: unpack 

unpack:
    gcc unpack.c -o unpack
    ./unpack

Обратите внимание на вашу версию «Я также пробовал»: я не могу воспроизвести отображаемое вами сообщение об ошибке. Но в вашем make-файле есть нежелательный #, и используется определенная фальшивая цель, например make unpack.

Если вы также хотите, чтобы "unpack.c" компилировался, если это необходимо, или не компилировался, если в этом нет необходимости, тогда вам нужно создать дополнительные правила.

Это сделано для GNU make в соответствии с
https://www.gnu.org/software/make/ manual / html_node / Phony-Targets.html

Я тестировал с GNU Make 3.81

Примечание по тестированию:
Я пробовал использовать "эхо" перед каждой командой (дважды проверяя вкладки, где это необходимо).
Вывод для make unpack:

echo gcc unpack.c -o unpack
gcc unpack.c -o unpack
echo ./unpack
./unpack
2
Yunnosch 8 Мар 2018 в 10:14