Makefile不会更新对象

时间:2015-11-19 14:10:03

标签: makefile fortran gfortran fortran77

即使我一步一步跟随GNU make online manual,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

根据我在makefile上学到的知识,funz.forfunz.o的先决条件。每当我更改源代码funz.for时,make都应更新funz.o并再次将其链接到main。但每当我发布make时,我都会被告知main是最新的,并且无法识别funz.for中的更改。 This question我发现与同一问题有关,但并不能解决我的问题,因为我认为我的先决条件是正确的。
我错过了什么吗?

更新1

正如Etan Reisner所说,这是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客户端编辑我的源文件,看起来,在更新我的源文件之后,"最后修改过的"时间不对。正如您在this picture中看到的那样,即使我在几分钟之前修改了funz.for,其最后一次更改的显示时间也比我实际时间早6个小时(在这里差不多是下午5点) )。

1 个答案:

答案 0 :(得分:0)

我使用的远程计算机似乎与本地计算机的时间不同,因此不同的时间戳和makefile无法正常工作。