人生中的第一篇博客,不知道如何开始,闲言碎语就不多说了,直奔我们的主题吧。
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 点击打开链接
###################################### # ###################################### 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
###################################### # # ###################################### 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)
###################################### # # ###################################### #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) 希望这些模板对大家有用哦。