在开发过程中,总是会偶尔遇到一些小问题不太确定,一般都是通过编写一个简单的小程序来测试验证这些小问题的答案,解除疑惑,也比理论答案更让人放心。只是随着时间积累,验证小程序数量越来越多,每次在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)
|
需要编译某个测试程序时,在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'
' '
)
|