11

      最近在Linux下编程是对makefile文件的编写感觉很不顺手,于是专门学习了GNU_Makefile中文手册,然后在soundtouch源码的基础上写了个比较经典的makefile文件,当是练手,如有不对的地方,还请大虾指点。

下载SoundTouch源码

      先下载SoundTouch源码,git地址为:https://gitlab.com/soundtouch...

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.png

      lib目录下生成soundtouch.a和soundtouch.so两个库文件


懒熊工作室
94 声望4 粉丝