makefile文件的编写

5次阅读

共计 2398 个字符,预计需要花费 6 分钟才能阅读完成。

      最近在 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 = 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 目录下如图所示:
      lib 目录下生成 soundtouch.a 和 soundtouch.so 两个库文件

正文完
 0