|
最近对makefile产生了兴趣。然后再网上查了一些关于makefile的资料,其中也看到了很多问题,其中有一个也是我很关注的问题就是关于makefile中是否包含头文件的问题。
问题重述:
假设我有一个头文件hello.h里面定义一个宏#difine PI 3.14,然后我在main.cc文件中include这个头文件,在主函数中打印PI的值。
下面是makefile文件:
main:main.o
g++ main.o -o main
main.o:main.cc
g++ -c mian.cc -o main.o
如何makefile这样写的话,我们修改hello.h中的PI的宏定义,之后再执行make,系统会告诉你此时的main已经是最新的了,也就是说PI值的改变不会使make重新执行。
如果我们在makefile中修改一下:
main.o:main.cc hello.h
这个时候修改PI的值,make会重新执行。
这是一种简单的情况,如果我们makefile中的文件很多,并且依赖的头文件也很多,这样每个都加岂不是很麻烦。
这里我说一下我的想法:
我们知道makefile中每个命令的执行是要比较目标文件和依赖文件的时间,也就是说只有当依赖文件比目标文件新的情况下命令才会执行(当然,我这里假设目标文件存在,如果目标文件不错在的话,命令肯定是要执行的)。如果我们的依赖文件找不到的话,那么命令应该也是要执行的。好,这里就是我要说的重点,就是依赖文件不存在,这里的依赖文件当然不是源文件了,而只是中间文件,比如说.o文件。假设我们每次执行完成之后,把.o文件都删除,这样就找不到目标的依赖文件了,那么它岂不是每次都要执行命令。
下面是改进之后的makefile:
all:main clean
main:main.o
g++ main.o -o main
main.o:main.cc
g++ -c mian.cc -o main.o
clean:
mv -f main.o #*.o
这样每次执行make是都会生出新的main文件。
如果出现多重包含的话这样做也没有问题,假设有p1.h里面定义#define MAXSIZE 20 ,然后hello.h里面#include "p1.h",在main.cc里面打印MAXSIZE的值。修改p1.h里面MAXSIZE的值,main文件也会同步更新。
这只是我个人的一点看法,欢迎大家能够提出一些问题。 |
|