2015-11-19 99 views
-1

尽管我一步一步跟着GNU make online manual,但makefiles上的问题仍令我困惑。
我工作在一个非常简单的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

由于要求由伊坦赖斯纳,这里是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,其最后一次更改的显示时间在我的实际时间(这里差不多5个小时)之前的6个小时也是无法解释的。

+1

你可以显示'make -rRd'的输出吗? –

+0

@EtanReisner:当然!我已经用你提供的信息更新了这个问题。 – 19lorenz88

+0

'先决条件\'funz.for'比目标'funz.o'更老''认为你的源文件比你的目标文件早。你有没有改变它? –

回答

0

看起来像我正在使用的远程计算机有一个不同于本地计算机的时间,因此不同的时间戳和生成文件不起作用。