Несмотря на то, что я следую онлайн-руководству GNU make шаг за шагом, проблема с make-файлами все еще озадачивает меня.
Я работаю над очень простым make-файлом:
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
Согласно тому, что я узнал о make-файлах, funz.for
является необходимым условием для funz.o
. Каждый раз, когда я меняю исходный код funz.for
, make
должен обновить funz.o
и снова связать его с main
. Но всякий раз, когда я запускаю make
, мне говорят, что main
обновлена и не распознает изменения в funz.for
. Этот вопрос, который я обнаружил, связан с такая же проблема, но не решает мою, так как я думаю, что мои предварительные условия сформулированы правильно.
Я что-то упустил?
ОБНОВЛЕНИЕ 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'.
ОБНОВЛЕНИЕ 2
Я заметил кое-что действительно странное (которое я всегда упускал из виду): я редактирую свои исходные файлы через клиент WinSCP, и кажется, что после обновления моих исходных файлов время «последнего изменения» идет не так. Как вы можете видеть на этой картинке, даже если я изменил funz.for
несколько минут назад, показанное время его последнего изменения необъяснимо на 6 часов раньше моего фактического времени (здесь почти 17:00).
make -rRd
? - person Etan Reisner   schedule 19.11.2015Prerequisite `funz.for' is older than target `funz.o'.
make считает, что ваш исходный файл старше вашего объектного файла. Вы внесли в него изменения? - person Etan Reisner   schedule 19.11.2015funz.for
и сохранил исходный файл: но, тем не менее,make
считает его более старым, чемfunz.o
, и считает, что нет необходимости обновлятьmain
. - person 19lorenz88   schedule 19.11.2015stat funz.o funz.for; touch funz.for; stat funz.o funz.for; make -rRd
? (Чтобы проверить, правильно ли все работает.) - person Etan Reisner   schedule 19.11.2015date
, появится следующее время:gio 19 nov 2015, 17.29.43, EST
. Зона EST – UTC-5; но я в Италии, часовой пояс которой UTC +1. Это может объяснить 6-часовой разрыв. Кажется, я столько всего не знал о своей рабочей станции! Я работаю с протоколом SCP: я проверил его в правом нижнем углу моей панели WinSCP. - person 19lorenz88   schedule 19.11.2015