Несмотря на то, что я выполняю шаг за шагом GNU make online manual, проблема с make-файлами все еще меня озадачивает.
Я работаю на очень простой Makefile:Файл Makefile не обновляет объекты
OBJ = main.o funz.o
main : $(OBJ)
gfortran -g -o main $(OBJ)
funz.o : funz.for
gfortran -g -c funz.for
main.o : main.for
gfortran -g -c main.for
clean :
rm main.o funz.o
Согласно тому, что я узнал о Makefiles, funz.for
является необходимым условием для funz.o
. Каждый раз, когда я меняю исходный код funz.for
, make
должен обновить funz.o
и связать его с main
еще раз. Но всякий раз, когда я запускаю make
, мне сказали, что main
обновлен и не распознает изменения в funz.for
. This question Я нашел связан с одной и той же проблемой, но не решает, потому что я думаю, что мои предпосылки заданы правильно.
Я что-то не хватает?
UPDATE 1
Как спросил Этан Рейснер, вот выход make -rRd
:
This program built for x86_64-redhat-linux-gnu
Reading makefiles...
Reading makefile `Makefile'...
Updating makefiles....
Considering target file `Makefile'.
Looking for an implicit rule for `Makefile'.
No implicit rule found for `Makefile'.
Finished prerequisites of target file `Makefile'.
No need to remake target `Makefile'.
Updating goal targets....
Considering target file `main'.
Considering target file `main.o'.
Considering target file `main.for'.
Looking for an implicit rule for `main.for'.
No implicit rule found for `main.for'.
Finished prerequisites of target file `main.for'.
No need to remake target `main.for'.
Finished prerequisites of target file `main.o'.
Prerequisite `main.for' is older than target `main.o'.
No need to remake target `main.o'.
Considering target file `funz.o'.
Considering target file `funz.for'.
Looking for an implicit rule for `funz.for'.
No implicit rule found for `funz.for'.
Finished prerequisites of target file `funz.for'.
No need to remake target `funz.for'.
Finished prerequisites of target file `funz.o'.
Prerequisite `funz.for' is older than target `funz.o'.
No need to remake target `funz.o'.
Finished prerequisites of target file `main'.
Prerequisite `main.o' is older than target `main'.
Prerequisite `funz.o' is older than target `main'.
No need to remake target `main'.
make: `main' is up to date.
А вот выход stat funz.o funz.for; touch funz.for; stat funz.o funz.for; make -rRd
File: `funz.o'
Size: 3176 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 58197897 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 505/ lorenzo) Gid: ( 505/ lorenzo)
Access: 2015-11-19 16:23:06.200737262 -0500
Modify: 2015-11-19 16:23:06.192737262 -0500
Change: 2015-11-19 16:23:06.192737262 -0500
File: `funz.for'
Size: 129 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 58196947 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 505/ lorenzo) Gid: ( 505/ lorenzo)
Access: 2015-11-19 16:23:06.183737262 -0500
Modify: 2015-11-19 16:23:06.174737262 -0500
Change: 2015-11-19 16:23:06.174737262 -0500
File: `funz.o'
Size: 3176 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 58197897 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 505/ lorenzo) Gid: ( 505/ lorenzo)
Access: 2015-11-19 16:23:06.200737262 -0500
Modify: 2015-11-19 16:23:06.192737262 -0500
Change: 2015-11-19 16:23:06.192737262 -0500
File: `funz.for'
Size: 129 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 58196947 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 505/ lorenzo) Gid: ( 505/ lorenzo)
Access: 2015-11-19 16:23:47.478737151 -0500
Modify: 2015-11-19 16:23:47.478737151 -0500
Change: 2015-11-19 16:23:47.478737151 -0500
GNU Make 3.81
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
This program built for x86_64-redhat-linux-gnu
Reading makefiles...
Reading makefile `Makefile'...
Updating makefiles....
Considering target file `Makefile'.
Looking for an implicit rule for `Makefile'.
No implicit rule found for `Makefile'.
Finished prerequisites of target file `Makefile'.
No need to remake target `Makefile'.
Updating goal targets....
Considering target file `main'.
Considering target file `main.o'.
Considering target file `main.for'.
Looking for an implicit rule for `main.for'.
No implicit rule found for `main.for'.
Finished prerequisites of target file `main.for'.
No need to remake target `main.for'.
Finished prerequisites of target file `main.o'.
Prerequisite `main.for' is older than target `main.o'.
No need to remake target `main.o'.
Considering target file `funz.o'.
Considering target file `funz.for'.
Looking for an implicit rule for `funz.for'.
No implicit rule found for `funz.for'.
Finished prerequisites of target file `funz.for'.
No need to remake target `funz.for'.
Finished prerequisites of target file `funz.o'.
Prerequisite `funz.for' is newer than target `funz.o'.
Must remake target `funz.o'.
gfortran -g -c funz.for
Putting child 0x0197ea80 (funz.o) PID 69914 on the chain.
Live child 0x0197ea80 (funz.o) PID 69914
Reaping winning child 0x0197ea80 PID 69914
Removing child 0x0197ea80 PID 69914 from chain.
Successfully remade target file `funz.o'.
Finished prerequisites of target file `main'.
Prerequisite `main.o' is older than target `main'.
Prerequisite `funz.o' is newer than target `main'.
Must remake target `main'.
gfortran -g -o main main.o funz.o
Putting child 0x019830d0 (main) PID 69917 on the chain.
Live child 0x019830d0 (main) PID 69917
Reaping winning child 0x019830d0 PID 69917
Removing child 0x019830d0 PID 69917 from chain.
Successfully remade target file `main'.
UPDATE 2
Я заметил что-то действительно странное (чего я всегда забыл): Я редактирую исходные файлы через клиент WinSCP, и, похоже, после обновления моих исходных файлов время «последнего изменения» идет не так. Как вы можете видеть в this picture, даже если я изменил funz.for
несколько минут назад, показанное время его последнего изменения необъяснимо за 6 часов до моего фактического времени (здесь почти 5 P.M.).
Можете ли вы показать вывод из 'make -rRd'? –
@EtanReisner: конечно! Я уточнил вопрос с запрошенной вами информацией. – 19lorenz88
'Предварительное условие \ funz.for 'старше целевого \ funz.o'.' заставляет думать, что ваш исходный файл старше вашего объектного файла. Вы изменили его? –