最近在Linux下编程是对makefile文件的编写感觉很不顺手,于是专门学习了GNU_Makefile中文手册,然后在soundtouch源码的基础上写了个比较经典的makefile文件,当是练手,如有不对的地方,还请大虾指点。下载SoundTouch源码      先下载SoundTouch源码,git地址为:https://gitlab.com/soundtouch…makefile编写规则简要说明1.makefile的命令行以[tab]键开始2.makefile的目标必须放在第一个命令行,如果有多个目标,可以使用:          all  : target1 target2 target33.VPATH可以设置源文件搜索路径4..PHONY是一个伪目标,可以防止在makefile 中定义的执行命令的目标名和工作目录下的名字出现冲突,另一种是提高执行makefile的效率.makefile编写CC = g++AR = arINSTALLDIR = ../SRCDIR = ../../../source/SoundTouchINCDIR = ../../../includeOBJDIR = ./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.aLIBTARGET = ./lib/$(LIBNAME)#需要编译的so库名称TARGETNAME = soundtouch.soTARGET = ./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:cleanclean: rm -f $(TARGET) $(LIBTARGET) $(OBJDIR)/.o $(OBJDIR)/.d $(OBJDIR)/.d. rm -f $(INSTALLDIR)/include/.h $(INSTALLDIR)/lib/.a $(INSTALLDIR)/lib/*.so#安装.PHONY:installinstall: @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      将此makefile文件放在soundtouch/build/linux/make目录下,打开terminal,执行make,编译通过在执行make install,完成后在soundtouch/build/linux/目录下生成include和lib目录,include目录下如图所示:      lib目录下生成soundtouch.a和soundtouch.so两个库文件