本文提供一个在GNU/Linux环境下通用的智能Makefile模板,用户可以将其引入到自己的工程当中。即使用户对此
Makefile的工作原理不甚了解,但是只需要修改少数几个关键变量,就可以满足不同的应用需求。
1. 使用环境
GNU make 3.8.1或者以上版本
sed
gcc/binutils
cygwin或者Linux
2. 关键变量
CROSS_COMPILE:交叉编译器前缀
OPTIMIZE:关于优化的编译参数
WARNINGS:关于warning的编译参数
DEFS: 关于宏定义的编译参数
EXTRA_CFLAGS:其它的编译参数
$(OPTIMIZE) $(WARNINGS) $(DEFS) $(EXTRA_CFLAGS)共同构成了传给gcc的编译参数。
INC_DIR:头文件目录
SRC_DIR:源文件目录(当前目录.是被默认包含的)
OBJ_DIR:object文件的输出目录
EXTRA_SRC:源文件列表
EXCLUDE_FILES:exclude文件列表
SUFFIX:源文件的后缀名
TARGET:最终的目标程序名
TARGET_TYPE:目标程序的类型。
可以定义的类型为:ar(static library),so(shared library)和app(application)。
最终Makefile的行为是:
在$(SRC_DIR)定义的每个目录中查找后缀为$(SUFFIX)的文件,并加上$(EXTRA_SRC)中的文件,然后排除掉
$(EXCLUDE_FILES)中的文件,获得本工程定义的源文件列表。对于每一个源文件,编译生成的一个.o文件和一个.d文件
(依赖文件),放在$(OBJ_DIR)目录下。最终生成的目标文件为$(TARGET)。
此Makefile已经充分考虑到文件之间的依赖关系,即,如果某个头文件发生改变,当运行make的时候,所有依赖于它的
源文件都将被重新编译。
附件是一个例子,演示了如何处理不同目录,如何处理不同目标类型,以及如何exclude文件。
example.rar
Makefile的工作原理不甚了解,但是只需要修改少数几个关键变量,就可以满足不同的应用需求。
1. 使用环境
GNU make 3.8.1或者以上版本
sed
gcc/binutils
cygwin或者Linux
2. 关键变量
CROSS_COMPILE:交叉编译器前缀
OPTIMIZE:关于优化的编译参数
WARNINGS:关于warning的编译参数
DEFS: 关于宏定义的编译参数
EXTRA_CFLAGS:其它的编译参数
$(OPTIMIZE) $(WARNINGS) $(DEFS) $(EXTRA_CFLAGS)共同构成了传给gcc的编译参数。
INC_DIR:头文件目录
SRC_DIR:源文件目录(当前目录.是被默认包含的)
OBJ_DIR:object文件的输出目录
EXTRA_SRC:源文件列表
EXCLUDE_FILES:exclude文件列表
SUFFIX:源文件的后缀名
TARGET:最终的目标程序名
TARGET_TYPE:目标程序的类型。
可以定义的类型为:ar(static library),so(shared library)和app(application)。
最终Makefile的行为是:
在$(SRC_DIR)定义的每个目录中查找后缀为$(SUFFIX)的文件,并加上$(EXTRA_SRC)中的文件,然后排除掉
$(EXCLUDE_FILES)中的文件,获得本工程定义的源文件列表。对于每一个源文件,编译生成的一个.o文件和一个.d文件
(依赖文件),放在$(OBJ_DIR)目录下。最终生成的目标文件为$(TARGET)。
此Makefile已经充分考虑到文件之间的依赖关系,即,如果某个头文件发生改变,当运行make的时候,所有依赖于它的
源文件都将被重新编译。
附件是一个例子,演示了如何处理不同目录,如何处理不同目标类型,以及如何exclude文件。
![](https://i-blog.csdnimg.cn/blog_migrate/e7d97fb07bb7a77f51122b15fd5fba78.gif)
下面贴出楼主常用的一个简单测试程序用的Makefile模板:
- #####################################################################
- # Copyright : GUOG reserved, 2010-2099
- # Name : Makefile for onvif_test
- # Date : 2013-09-17
- # Author : guog
- # Modity : leoluo
- # Email : leoluopy@gmail.com
- ######################################################################
- CFLAGS =-DWITH_OPENSSL -DWITH_NONAMESPACES -DWITH_DOM -I./ -I./plugin
- # -DDEBUG -g -O2
- #CROSS:=arm-hisiv100nptl-linux-
- CC:=$(CROSS)gcc
- AR:=$(CROSS)ar
- STRIP:=$(CROSS)strip
- NVT_NAME:= server_onvif
- NVC_NAME:= client_onvif
- NVT_OBJS = soapC.o soapServer.o stdsoap2.o duration.o onvif_server_interface.o onvif_server.o onvif_function.c soapClient.o
- NVC_OBJS = soapC.o soapClient.o stdsoap2.o duration.o onvif_client.o dom.o \
- plugin/wsseapi.o plugin/smdevp.o plugin/mecevp.o plugin/threads.o plugin/wsaapi.o
- all: nvt nvc
- nvt: $(NVT_OBJS)
- $(CC) ${CFLAGS} -o $(NVT_NAME) $(NVT_OBJS) -lpthread -lssl -lcrypto -luuid
- $(STRIP) $(NVT_NAME)
- nvc: $(NVC_OBJS)
- $(CC) ${CFLAGS} -o $(NVC_NAME) $(NVC_OBJS) -lpthread -lssl -lcrypto -luuid
- $(STRIP) $(NVC_NAME)
- clean:
- rm -f *.o *.a *.log plugin/*.o $(NVT_NAME) $(NVC_NAME)