最近在Linux下编程是对makefile文件的编写感受很不顺手,因而专门学习了GNU_Makefile中文手册,而后在soundtouch源码的基础上写了个比较经典的makefile文件,当是练手,若有不对的地方,还请大虾指点。linux
先下载SoundTouch源码,git地址为:https://gitlab.com/soundtouch...git
1.makefile的命令行以[tab]键开始
2.makefile的目标必须放在第一个命令行,若是有多个目标,能够使用:
all : target1 target2 target3
3.VPATH能够设置源文件搜索路径
4..PHONY是一个伪目标,能够防止在makefile 中定义的执行命令的目标名和工做目录下的名字出现冲突,另外一种是提升执行makefile的效率.编程
CC = g++ AR = ar INSTALLDIR = ../ SRCDIR = ../../../source/SoundTouch INCDIR = ../../../include OBJDIR = ./obj # CFLAGS中-I后跟的只能是包含头文件, -fPIC:告诉编译器产生与位置无关代码,-Wall,显示全部警告 CFLAGS = -Wall -fPIC -I$(INCDIR) #-shared:编译动态库,-fPIC:告诉编译器产生与位置无关代码 LDFLAGS = -shared -fPIC #设置源代码搜索目录 VPATH = $(SRCDIR) #须要编译的.o文件列表 OBJS = $(OBJDIR)/AAFilter.o $(OBJDIR)/BPMDetect.o $(OBJDIR)/cpu_detect_x86.o $(OBJDIR)/FIFOSampleBuffer.o $(OBJDIR)/FIRFilter.o $(OBJDIR)/InterpolateCubic.o $(OBJDIR)/InterpolateLinear.o $(OBJDIR)/InterpolateShannon.o $(OBJDIR)/mmx_optimized.o $(OBJDIR)/PeakFinder.o $(OBJDIR)/RateTransposer.o $(OBJDIR)/SoundTouch.o $(OBJDIR)/sse_optimized.o $(OBJDIR)/TDStretch.o #须要编译的lib库名称 LIBNAME = soundtouch.a LIBTARGET = ./lib/$(LIBNAME) #须要编译的so库名称 TARGETNAME = soundtouch.so TARGET = ./lib/$(TARGETNAME) #第一个命令,makefile的终极目标,须使用tab键开始,此处将产生两个目标 all : $(TARGET) $(LIBTARGET) #生产动态库,$@:目标集合, $^:全部依赖目标的集合, 会去除重复的依赖目标 $(TARGET) : $(OBJS) $(CC) $(LDFLAGS) -o $@ $^ #生成lib库 $(LIBTARGET):$(OBJS) $(AR) cr $@ $(OBJS) #.o文件依赖的cpp,此处使用模式匹配%.o表示以.o结尾的任意文件 $(OBJDIR)/%.o:%.cpp $(CC) $(CFLAGS) -o $@ -c $< #.PHONY是一个伪目标,能够防止在Makefile中定义的执行命令的目标和工做目录下的实际文件出现名字冲突,另外一种是提升执行makefile时的效率 .PHONY:clean clean: rm -f $(TARGET) $(LIBTARGET) $(OBJDIR)/*.o $(OBJDIR)/*.d $(OBJDIR)/*.d.* rm -f $(INSTALLDIR)/include/*.h $(INSTALLDIR)/lib/*.a $(INSTALLDIR)/lib/*.so #安装 .PHONY:install install: @if test ! -d $(INSTALLDIR) ; then mkdir -p $(INSTALLDIR); fi @if test ! -d $(INSTALLDIR)/include ; then mkdir -p $(INSTALLDIR)/include; fi @if test ! -d $(INSTALLDIR)/lib ; then mkdir -p $(INSTALLDIR)/lib; fi cp $(INCDIR)/BPMDetect.h $(INSTALLDIR)/include/ cp $(INCDIR)/FIFOSampleBuffer.h $(INSTALLDIR)/include/ cp $(INCDIR)/FIFOSamplePipe.h $(INSTALLDIR)/include/ cp $(INCDIR)/SoundTouch.h $(INSTALLDIR)/include/ cp $(INCDIR)/soundtouch_config.h $(INSTALLDIR)/include/ cp $(INCDIR)/STTypes.h $(INSTALLDIR)/include/ cp $(LIBTARGET) $(INSTALLDIR)/lib/ cp $(TARGET) $(INSTALLDIR)/lib/
将此makefile文件放在soundtouch/build/linux/make目录下,打开terminal,执行make,编译经过在执行make install,完成后在soundtouch/build/linux/目录下生成include和lib目录,include目录下如图所示:gitlab
lib目录下生成soundtouch.a和soundtouch.so两个库文件学习