Ubuntu下的Makefile模板汇总

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

 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)

希望这些模板对大家有用哦。



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值