makefile文件的編寫

      最近在Linux下編程是對makefile文件的編寫感受很不順手,因而專門學習了GNU_Makefile中文手冊,而後在soundtouch源碼的基礎上寫了個比較經典的makefile文件,當是練手,若有不對的地方,還請大蝦指點。linux

下載SoundTouch源碼

      先下載SoundTouch源碼,git地址爲:https://gitlab.com/soundtouch...git

makefile編寫規則簡要說明

1.makefile的命令行以[tab]鍵開始
2.makefile的目標必須放在第一個命令行,若是有多個目標,能夠使用:
          all  : target1 target2 target3
3.VPATH能夠設置源文件搜索路徑
4..PHONY是一個僞目標,能夠防止在makefile 中定義的執行命令的目標名和工做目錄下的名字出現衝突,另外一種是提升執行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

      將此makefile文件放在soundtouch/build/linux/make目錄下,打開terminal,執行make,編譯經過在執行make install,完成後在soundtouch/build/linux/目錄下生成include和lib目錄,include目錄下如圖所示:
clipboard.pnggitlab

      lib目錄下生成soundtouch.a和soundtouch.so兩個庫文件學習

相關文章
相關標籤/搜索