LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 913|回复: 3

关于makefile文件的一点看法,请大家指教

[复制链接]
发表于 2010-12-2 17:14:07 | 显示全部楼层 |阅读模式
最近对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文件也会同步更新。
这只是我个人的一点看法,欢迎大家能够提出一些问题。
发表于 2010-12-3 10:56:56 | 显示全部楼层
看看cmake吧
回复 支持 反对

使用道具 举报

发表于 2010-12-15 22:02:24 | 显示全部楼层
不想写依赖就直接用虚拟目标,这样每次make都会更新

其实我不喜欢手动写makefile的,我现在用codelite组织项目,codelite自动帮我导出了makefile,省事省力
回复 支持 反对

使用道具 举报

发表于 2010-12-16 11:48:36 | 显示全部楼层
其实就是自动生成所包含的头文件依赖的问题。建议大家想问题的时候都多搜索,避免重复发明轮子。

makedepend 是原生用来解决这个问题的。

其他诸如 automake/autoconf 系统和 cmake 系统也都能够自动解决相关问题。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表