最近在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兩個庫文件學習