人生中的第一篇博客,不知道如何开始,闲言碎语就不多说了,直奔我们的主题吧。
1.Makefile简介
windows开发人员对于makefile可能比较陌生,因为windows下开发应用几乎都是用的IDE(集成开发环境),内部集成编译器,所以程序员并不需要关心程序如何去编译的,只需知道点击哪里编译即可,其实IDE的编译器也是基于Makefile的,只不过不需要自己编写Makefile. 但是在linux平台下开发是需要自己编写Makefile去编译程序的。
说了这么多 ,Makefile到底是干什么的呢?makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
详细的介绍就不在这多说了,具体可以看这里:makefile中文教程_百度文库
https://wenku.baidu.com/view/48d528220722192e4536f6cd.html?re=view 点击打开链接
2.Makefile模板
2.1 支持c/c++ 混编的Makefile模板 ---生成可执行文件
#一个实用的makefile,能自动编译当前目录下所有.c/.cpp源文件,支持二者混合编译
#并且当某个.c/.cpp、.h或依赖的源文件被修改后,仅重编涉及到的源文件,未涉及的不编译
#详解文档:http://blog.csdn.net/huyansoft/article/details/8924624
#----------------------------------------------------------
#编译工具用g++,以同时支持C和C++程序,以及二者的混合编译
CC=g++
#使用$(winldcard *.c)来获取工作目录下的所有.c文件的列表
#sources:=main.cpp command.c
#变量sources得到当前目录下待编译的.c/.cpp文件的列表,两次调用winldcard、结果连在一起即可
sources:=$(wildcard *.c) $(wildcard *.cpp)
#wildcard 介绍
#SRC = $(wildcard *.c ./foo/.c)
#搜索当前目录及./foo/下所有以.c结尾的文件,生成一个以空格间隔的文件名列表,并赋值给SRC.当前目录文件只有文件名,子目录下的文件名包含路径信息,比如./foor/bar.c
#变量objects得到待生成的.o文件的列表,把sources中每个文件的扩展名换成.o即可。这里两次调用patsubst函数,第1次把sources中所有.cpp换成.o,第2次把第1次结果里所有.c换成.o
objects:=$(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(sources)))
#4、patsubst
#使用:OBJ = $(patsubst %.c %.o $(SRC))
#patsubst是patten substitude的缩写,匹配替代的意思。这句是在SRC中找到所有.c 结尾的文件,然后把所有的.c换成.o。
#3、notdir
#使用:SRC = $(notdir wildcard)
#去除所有的目录信息,SRC里的文件名列表将只有文件名。
#----------------------------------------------------------
#当$(objects)列表里所有文件都生成后,便可调用这里的 $(CC) $^ -o $@ 命令生成最终目标all了
#把all定义成第1个规则,使得可以把make all命令简写成make
all: $(objects)
$(CC) $(CPPFLAGS) $^ -o $@
@./$@ #编译后立即执行
#这段使用make的模式规则,指示如何由.c文件生成.o,即对每个.c文件,调用gcc -c XX.c -o XX.o命令生成对应的.o文件
#如果不写这段也可以,因为make的隐含规则可以起到同样的效果
%.o: %.c
$(CC) $(CPPFLAGS) -c $< -o $@
#同上,指示如何由.cpp生成.o,可省略
%.o: %.cpp
$(CC) $(CPPFLAGS) -c $< -o $@
#----------------------------------------------------------
#清除所有临时文件(所有.o和.d)。之所以把clean定义成伪目标,是因为这个目标并不对应实际的文件
.PHONY: clean
clean: #.$$已在每次使用后立即删除。-f参数表示被删文件不存在时不报错
rm -f all $(objects) $(dependence)
2.2 只支持 c源码的Makefile --- 生成可执行文件(minigui开发使用)
######################################
#
######################################
DIR_SRC = ./src/
DIR_OBJ = ./obj/
DIR_LIB1 = ./minigui/source/output/lib
DIR_LIB2 = /usr/local/arm_linux_4.2/arm-none-linux-gnueabi/lib
DIR_INC1 = ./minigui/source/output/include
DIR_INC2 = /usr/local/arm_linux_4.2/arm-linux/include
#source file
#源文件,自动找所有.c,并将目标定义为同名.o文件
SOURCE = $(wildcard $(DIR_SRC)*.c)
OBJS = $(patsubst %.c,$(DIR_OBJ)%.o,$(notdir ${SOURCE}))
#target you can change test to what you want
#目标文件名,输入任意你想要的执行文件名
TARGET = test
#compile and lib parameter
#编译参数
#CC = gcc 本地编译指令
CC = arm-none-linux-gnueabi-gcc 交叉编译指令
LDFLAGS = -L$(DIR_LIB1) -L$(DIR_LIB2)
CFLAGS = -muclibc -I$(DIR_INC1) -I$(DIR_INC2) -Wall -Wstrict-prototypes -pipe
CXXFLAGS = $(CFLAGS) -DHAVE_CONFIG_H
LIBS = -lminigui_ths -ldl -lm -lpthread -ljpeg -lfreetype -lpng -lts
$(TARGET):$(OBJS)
$(CC) $(CXXFLAGS) -o $@ $(OBJS) $(LDFLAGS) $(LIBS)
${DIR_OBJ}%.o:${DIR_SRC}%.c
$(CC) $(CXXFLAGS) -c $< -o $@
.PHONY:clean
clean:
rm test;cd ./obj;rm *.o
2.3 支持C源码的Makefile-----生成动态库
######################################
#
#
######################################
DIR_INC = ./inc
DIR_LIB = ./libsrc
DIR_OBJ = ./obj
DIR_TEST = ./test
SHARE_LIB = libname.so
SRC = $(wildcard ${DIR_LIB}/*.c)
OBJ = $(patsubst %.c,${DIR_OBJ}/%.o,$(notdir ${SRC}))
TARGET = main
BIN_TARGET = ${DIR_BIN}/${TARGET}
#CC =arm-none-linux-gnueabi-gcc -lrt
CC =gcc -lrt
LD = ld
CFLAGS = -Wall -g -I ${DIR_INC}
LDFLAGS = -shared -fPIC
#$@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件。
$(SHARE_LIB):${OBJ}
$(LD) $(LDFLAGS) -o $@ $^
${DIR_OBJ}/%.o:${DIR_LIB}/%.c
$(CC) $(CFLAGS) -c $< -o $@
.PHONY:cp
cp:
cp $(SHARE_LIB) $(DIR_TEST)
.PHONY:clean
clean:
cd ./obj;rm *.o;cd ..;rm *.so
或者
######################################
#
#
######################################
#target you can change test to what you want
#共享库文件名,lib*.so
TARGET := libtest.so
#compile and lib parameter
#编译参数
CC := gcc
LIBS :=
LDFLAGS :=
DEFINES :=
INCLUDE := -I.
CFLAGS := -g -Wall -O3 $(DEFINES) $(INCLUDE)
CXXFLAGS:= $(CFLAGS) -DHAVE_CONFIG_H
SHARE := -fPIC -shared -o
#i think you should do anything here
#下面的基本上不需要做任何改动了
#source file
#源文件,自动找所有.c和.cpp文件,并将目标定义为同名.o文件
SOURCE := $(wildcard *.c) $(wildcard *.cpp)
OBJS := $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(SOURCE)))
.PHONY : everything objs clean veryclean rebuild
everything : $(TARGET)
all : $(TARGET)
objs : $(OBJS)
rebuild: veryclean everything
clean :
rm -fr *.o
veryclean : clean
rm -fr $(TARGET)
$(TARGET) : $(OBJS)
$(CC) $(CXXFLAGS) $(SHARE) $@ $(OBJS) $(LDFLAGS) $(LIBS)
2.4 支持C源码的makefile----生成静态库
######################################
#
#
######################################
#target you can change test to what you want
#共享库文件名,lib*.a
TARGET := libtest.a
#compile and lib parameter
#编译参数
CC := gcc
AR = ar
RANLIB = ranlib
LIBS :=
LDFLAGS :=
DEFINES :=
INCLUDE := -I.
CFLAGS := -g -Wall -O3 $(DEFINES) $(INCLUDE)
CXXFLAGS:= $(CFLAGS) -DHAVE_CONFIG_H
#i think you should do anything here
#下面的基本上不需要做任何改动了
#source file
#源文件,自动找所有.c和.cpp文件,并将目标定义为同名.o文件
SOURCE := $(wildcard *.c) $(wildcard *.cpp)
OBJS := $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(SOURCE)))
.PHONY : everything objs clean veryclean rebuild
everything : $(TARGET)
all : $(TARGET)
objs : $(OBJS)
rebuild: veryclean everything
clean :
rm -fr *.o
veryclean : clean
rm -fr $(TARGET)
$(TARGET) : $(OBJS)
$(AR) cru $(TARGET) $(OBJS)
$(RANLIB) $(TARGET)
希望这些模板对大家有用哦。