我的项目Makefile文件模板

 

今天看到”那谁的技术博客“的我的项目Makefile文件模板。 平时在linux上小打小闹, 上上周,恰好自己准备做个linux的C++项目(我的第一个linux项目),,因此自己也整理出来了一套Makefile模板,一共花了三天时间才全部写完, 一直想抽空整理一下, 这里也分享一下。

项目分模块,不同模块的代码放在不同的文件夹下,main.cpp(包含main函数)单独放在main文件夹下。每个模块的文件夹下都有一个 Makefile,其中的每一个CPP文件都生成一个.o和.d文件, 同一个目录下的所有.o文件会被make成一个.a库文件(也就是Windows下的.lib文件), 最终调用main目录下的Makefile依次来调用不同模块的文件夹下的Makefile,将这些模块目录下的.a文件和main.cpp生成的 main.o文件链接成可执行文件。

且看我的login目录下的Makefile文件:

1 DIR=login
2 GTK_INCLUDE=`pkg-config –cflags gtk+-2.0`
3 SOURCES:=$(wildcard *.cpp)
4 OBJS:=$(subst .cpp,.o,$(SOURCES))
5 DEPS:=$(subst .cpp,.d,$(SOURCES))
6 CPPINCLUDE:=..
7 CPPFLAGS = -g -Wall -I$(CPPINCLUDE) $(GTK_INCLUDE)
8 CC=g++
9
10 .PHONY: all clean
11 all:lib$(DIR).a
12
13 lib$(DIR).a: $(OBJS)
14     ar crv $@ $(OBJS)
15
16 %.o:%.cpp
17     $(CC) $(CPPFLAGS) -c $<
18
19 include $(subst .cpp,.d,$(SOURCES))
20
21 %.d:%.cpp
22     $(CC) -MM $(CPPFLAGS) $< > $@.$$$$; \
23     sed ’s,\($*\)\.o[ :]*,\1.o $@:, g’ < $@.$$$$ > $@; \
24     rm -f $@.$$$$
25
26 clean:
27     -rm *.o *.a *.d

在linux下写Makefile的最大难点是源代码文件(这里是.cpp)的头文件依赖关系,如果一个cpp文件直接或间接包含的头文件变化,那么这个 cpp文件就需要重新编译。使用cc -MM test.cpp就可以生成cpp的.o文件的依赖关系。关于.d文件以及依赖关系,最好的教程是:

《《Managing Projects with GNU make, 3rd Edition》》

上面那一段也是从这本书里学习来的。

main文件夹下的Makefile如下:

1 LOGIN_DIR:=../login
2 NETWORK_DIR:=../network
3 UTILS_DIR:=../utils
4 SRC_DIRS:=$(LOGIN_DIR) $(NETWORK_DIR) $(UTILS_DIR)
5 ARS:=$(LOGIN_DIR)/liblogin.a $(NETWORK_DIR)/libnetwork.a $(UTILS_DIR)/libutils.a
6
7 DIR=main
8 SOURCES:=$(wildcard *.cpp)
9 OBJS:=$(subst .cpp,.o,$(SOURCES))
10 DEPS:=$(subst .cpp,.d,$(SOURCES))
11 CPPINCLUDE:=..
12 GTK_INCLUDE=`pkg-config –cflags gtk+-2.0`
13 GTK_LIB=`pkg-config –libs gtk+-2.0`
14 CPPFLAGS = -g -Wall -I$(CPPINCLUDE) $(GTK_INCLUDE)
15 CC=g++
16
17 .PHONY: all $(SRC_DIRS) $(SRC_DIRS_FOR_CLEAN) clean
18
19 all: $(SRC_DIRS) main
20
21
22 main: $(OBJS) $(ARS)
23     $(CC) -o main $(OBJS) $(ARS) $(GTK_LIB)
24
25
26 $(SRC_DIRS):
27     $(MAKE) –directory=$@
28
29
30
31 #以下为生成本目录下的.o文件
32 %.o:%.cpp
33     $(CC) $(CPPFLAGS) -c $<
34
35 include $(subst .cpp,.d,$(SOURCES))
36
37 %.d:%.cpp
38     $(CC) -MM $(CPPFLAGS) $< > $@.$$$$; \
39     sed ’s,\($*\)\.o[ :]*,\1.o $@:, g’ < $@.$$$$ > $@; \
40     rm -f $@.$$$$
41
42
43 clean:
44     for d in $(SRC_DIRS); \
45     do \
46         cd $$d; \
47         $(MAKE) clean; \
48     done \
49
50     -rm main *.o *.a *.d

其中,make clean也会循环依赖调用各个模块文件夹下的Makefile中的clean target。

参考的资料如下:

1. 跟我一起写 Makefile 陈皓 (CSDN)

2. Managing Projects with GNU make, 3rd Edition

当前这套模板的缺陷也很显然:

main里面需要手工写上所有模块的子目录名,当时没有网络,不能google,反正只好用上刚学到的所有Makefile知识了。可喜的是,对于小项目来说,这套 Makefile模板可以清晰地分模块,处理依赖关系,清理垃圾等,已经符合当前我的项目需求了。等以后不够用的时候再重构吧。

makefile也是一门语言,也有函数,也可以嵌入shell脚本,也可以写出死循环(我不幸经历了一次),也可以调试。最重要的目前我认为有两点:

1. 头文件的依赖关系

2. 调试, 测试,自己先做个简单的demo,建立几个文件夹,验证一下自己的想法

写完Makefile, 人生完整了一些。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
make是unix和其他操作系统上最持久的工具之一。自1970年问世以来,make至今仍旧是大多数程序开发项目的核心工具,它甚至被用来编译linux内核。阅读本书,读者将可以了解,尽管出现了许多新兴的竞争者为何make仍旧是开发项目中编译软件的首选工具。. 简单就是make欲达成的目标:在你变更源代码文件之后,想要重编译你的程序或其他输出文件之际,make会检查时间戳,找出被变更的文件并进行必要的重编译动作,因此不会浪费时间去重编译其他文件。为了达到这个目标,make提供了许多选项让你能够操作多个目录、为不同的平台编译不同版本的程序以及自定义编译方法。.. 本书第三版的重点是gnu make,这个版本的make已经成为行业标准。本书将会探索gnu make所提供的强大扩充功能。gnu make之所以广受欢迎是因为它是一个自由软件,并且几乎可以在包括微软windows(作为cygwin项目的一部分)的每个平台上使用 *************************************************************** 请注意: 下载完,评论的同时,请点击评论框上方的五角星(共5个五角星),这样你的被扣的积分就可以返还了。 如果只评论,不点击小五角星,积分不会返还。 一定要先下载完,再评论。如果先评论后下载,或者在下载的过程中评论,积分同样不会返还。 *************************************************************** 更多linux、ARM和C语言资源请参考: http://blog.csdn.net/arkofnoach/archive/2010/10/23/5960560.aspx
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值