尽管我一步一步跟着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.for
是funz.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个小时也是无法解释的。
你可以显示'make -rRd'的输出吗? –
@EtanReisner:当然!我已经用你提供的信息更新了这个问题。 – 19lorenz88
'先决条件\'funz.for'比目标'funz.o'更老''认为你的源文件比你的目标文件早。你有没有改变它? –