2015-11-19 2 views
-1

Несмотря на то, что я выполняю шаг за шагом 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.).

+1

Можете ли вы показать вывод из 'make -rRd'? –

+0

@EtanReisner: конечно! Я уточнил вопрос с запрошенной вами информацией. – 19lorenz88

+0

'Предварительное условие \ funz.for 'старше целевого \ funz.o'.' заставляет думать, что ваш исходный файл старше вашего объектного файла. Вы изменили его? –

ответ

0

Кажется, что удаленный компьютер, с которым я работаю, имел другое время, чем на локальном компьютере, поэтому разные временные метки и make-файл не работают.