Makefile,从最最基础的说起...

最近在用乌邦图的c++写一个小项目,才写了几个程序文件。

写程序总免不了修改,特别是在刚开始的时候,需要这样试试,那样试试,找找感觉,也是为以后的编程找一个比较好的思路。

但凡程序里有一个小小的改动,就要把项目全部编译一遍,细算起来,居然也浪费不少的时间。

一开始觉得项目小,没有必要弄个Makefile,没想到没有它还真不行。

最初的想法是到网上找一个Makefile模板,改改用比较省事。结果找到了一个,打开看了个一头雾水。竟然啥也不懂!

没办法,再找找大神们发的帖子,一点点学起来。总算发现Makefile虽然博大精深,但核心的东西还是很好理解的,对小项目来说,用起来还真不难。

写Makefile的初衷,无非就是想省点时间,只编译改动过的程序文件,没改的就不用再编译了,恰恰Makefile就是干这个活的。

比如,在Makefile文件里写上:

main.o: main.cpp main.hpp
    gcc -c $^

大部分内容都是一目了然,可能$^看起来有些头晕,不要着急,下面细细说来。

学习c++的一定会知道,从源程序文件到可执行程序,一般说要分两步,第一步是编译,从源文件生成目标文件,在这个例子里,是从main.cpp编译成main.o。第二步是连接,把目标文件和用到的一些库组装成一个可执行的程序。上面的Makefile里只写了第一步,编译。

main.o是目标,它是从程序文件main.cpp和头文件main.hpp编译后产生的,main.cpp和main.hpp叫做main.o的依赖。

第二行是编译命令,执行这个命令后,main.cpp和main.hpp就变成了main.o。

那么$^到底是什么呢?其实它就是第一行冒号后面的内容,在这个例子里就是main.cpp main.hpp,执行命令的时候,是这样的:

gcc -c main.cpp main.hpp

写好Makefile后,用make命令执行。

执行make命令的时候,它就会在当前目录下找Makefile或者makefile文件,如果找到了,就比较目标文件和依赖文件的日期,如果目标文件比较新,就不执行命令,如果依赖文件日期比较新,就执行命令。通过这个操作,达到只编译新改动文件的目的。

还是说上面这个例子,如果main.cpp和main.hpp中有一个时间比main.o新,就执行gcc -c main.cpp main.hpp命令。

假如main.cpp和main.hpp刚写完,还没有main.o文件呢?当然是看作main.cpp和main.hpp比main.o新,肯要执行命令了!

总结一下Makefile的最基本格式:

目标:依赖
<tab> 命令

如果依赖文件的日期比目标文件的日期新,就执行命令,否则不执行。注意,命令一定是用tab缩进的,不能是空格,这是make的硬规定,没有为什么。

好吧,到现在我的项目里才有4个程序文件,写出的Makefile如下:

main: main.o read.o write.o data.o
    gcc -o $@ $^ -lstdc++

main.o: main.cpp main.hpp
    gcc -c $^

read.o: read.cpp read.hpp
    gcc -c $^

write.o: write.cpp write.hpp
    gcc -c $^

data.o: data.cpp data.hpp
    gcc -c $^

每个命令前面的缩进,需要按一下键盘左面的Tab键,如果你的编辑器把tab自动转为空格,需要把这个转换功能关掉。

第二行里又多了一个$@,不用解释你可能就猜到了,它表示冒号前面的内容。翻译一下就是:

gcc -o main main.o read.o write.o data.o -lstdc++

这个文件在说,我需要一个名称是main的可执行文件,是用几个.o文件和库文件连接后生成的,在生成之前呢,要把每个.o文件和它的依赖文件做一下比较,看看是否需要重新编译。

假如成功编译之后,只改动了data.hpp中的内容,在执行make命令时,就只编译data.cpp,其它的几个.cpp文件就不再编译了。通过Makefile这种操作,节省了不必要的编译时间。

随着我的项目不断扩展,这点儿知识肯定不能满足我的需要了,我还会继续学习,到时,再和大家一起分享。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值