Makefile文件简单示例一:测试验证小程序的管理

在开发过程中,总是会偶尔遇到一些小问题不太确定,一般都是通过编写一个简单的小程序来测试验证这些小问题的答案,解除疑惑,也比理论答案更让人放心。只是随着时间积累,验证小程序数量越来越多,每次在shell上敲编译命令还是比较头疼的一件事,容易混乱而且还考验记忆、效率低下。

make和makefile文件是项目构建的有效工具,在一个完整的项目开发中基本都会用到它们来实现自动构建,以提高效率和可靠性。所以在这里也就借用make、makefile工具,充分应用makefile的规则来帮助管理测试验证的小程序。下面是该Makefile文件:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
CC= gcc
LIB_PATH+=$(HOME) /opt/lib   #使用的第三方库,主要是日志记录
CFLAGS+= -O2 -Wall -D_GNU_SOURCE_ -g
LDFLAGS+= -L$(LIB_PATH) -lzlog -lpthread
INC_FLAGS+= -I.
 
all     :       $(EXES)  #编译所有的测试程序
 
$(EXES)  :       %:%.o   #链接,使用匹配规则,每一个测试程序都是一个目标,可以单独make
         $(CC) -o $@ $^ $(LDFLAGS) -Wl,-rpath=$(LIB_PATH)
 
.c.o   :  #编译成目标文件,每一个目标文件都是一个目标,可以单独make
        $(CC) $(CFLAGS) -o $@ -c $< $(INC_FLAGS)
在Makefile中充分利用规则,就避免了手动输入源文件名称的麻烦和维护,同时还实现了扩展性——以后添加的测试程序,不修改Makefile同样可以进行编译管理,一劳永逸。如果觉得不需要目标文件的目标,可以去掉.c.o规则,使用默认的编译规则。

需要编译某个测试程序时,在shell对应makefile目录下使用make命令,然后敲tab键,会自动弹出可以执行的目标,也可以自动补全,不需要自己去记忆目标。

makefile的自动化变量:

?
1
2
3
4
5
6
7
1、$@:规则中所有的目标文件集
 
2、$<:依赖的第一个文件,如果依赖是以模式(%)定义的,那就表示符合模式的所有依赖文件集,一个一个取出来
 
3、$^:规则中的所有依赖文件集,以空格分隔,并且对目标做重复删除,模式条件下也是一个个取出来的
 
4、$+:跟$^一样,就是没做重复删除。

下面是使用同样规则管理一个人项目的Makefile文件,同样有很好的扩展,新增文件时,不需要修改Makefile。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
CC=arm-hismall-linux-g++
CXXFLAGS=-pipe -fno-exceptions -fno-rtti -Wall -O2 -DQWS
QT_DIR= $(HOME) /qt/qt-hisi-2 .2.0
LDFLAGS= -lqte -L$(QT_DIR) /install/lib -Wl,-rpath-link=$(QT_DIR) /build/lib
INCFLAGS= -I$(QT_DIR) /qtopia-free-2 .2.0 /qt2/include
 
HEADERS:= $(wildcard *.h) #找到所有头文件
MOCS:= $(HEADERS:%.h=moc_%.cpp)  #自动生成对应的moc文件名,以执行moc规则
 
SRCS:= $(wildcard *.cpp) #找到所有源文件
SRCS+= $(MOCS) #把moc文件名添加到源文件列表中
OBJS:= $(SRCS:%.cpp=%.o) #生成目标文件名列表
TARGET = show
 
all: $(TARGET)
 
$(TARGET): $(OBJS)
         $(CC) $^ -o $@ $(LDFLAGS)
 
$(MOCS):  moc_%.cpp:%.h
         moc $^ -o $@
 
$(OBJS):  %.o:%.cpp  #这些目标可以用来测试单个的源文件是否能编译通过,如存在语法错误等
         $(CC) $(CXXFLAGS) -c $^ -o $@ $(INCFLAGS)
 
clean:
         @ echo $(SRCS)
         @ echo $(OBJS)
         rm -f moc_*.cpp *.o $(TARGET)
 
.PHONY: all clean

上面的Makefile在执行clean时,会出现下面的错误提示,这是因为此时已经有moc_*.cpp源文件存在,而执行SRCS+= $(MOCS)会再次生成moc_*.cpp文件,所以会重复moc_*.o的目标。这个不影响项目编译。

?
1
Makefile:23: target `moc_home.o' given more than once in the same rule.


PS:解决上面目标重复的方法

只需要删除掉SRCS变量中的重复moc源文件就可以了,因此需要在Makefile文件中获取SRCS变量时稍微处理一下,将下面的语句添加上面的Makefile文件中SRCS+=$(MOCS)语句后面就OK了:

?
1
SRCS:= $(shell echo $(SRCS)| sed 's/ /\n/g' | sort | uniq | tr -t '\n' ' ' )
就是利用shell命令工具实现去除变量中的重复字符串单词。




FROM:  http://my.oschina.net/shelllife/blog/117816?p=1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值