Ubuntu下的Makefile模板汇总

xiaoxiao2021-02-28  101

人生中的第一篇博客,不知道如何开始,闲言碎语就不多说了,直奔我们的主题吧。

 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) 希望这些模板对大家有用哦。

转载请注明原文地址: https://www.6miu.com/read-26183.html

最新回复(0)