- 大家好!我来自南京,在 OpenHarmony 成长打算啃论文俱乐部,与
华为、软通能源、润和软件、拓维信息、深开鸿
等公司一起,学习和钻研操作系统技术
,
从往年 1 月 11 日退出 OpenHarmony 俱乐部曾经有靠近 8 个月工夫了。笔者始终在思考啃论文给我带来了些什么,通过啃论文能为 OpenHarmony 做些什么。笔者利用大二升大三寒假两个月工夫移植了 Speexdsp 这个三方库到 OpenHarmony 规范零碎,而对于后面的问题我仿佛找到了答案,现将啃论文和三方库移植分享教训如下:
因为想要分享的内容较多,为防止读者姥爷们失去看上来的急躁,分享将以连载的形式进行。
本期为 移植 speexdsp 到 OpenHarmony 规范零碎
的第②期,次要内容如下:
在 linux 上生成 speexdsp 的 so 动态链接库和.a 动态链接库
- make 和 make install 后会生成 speexdsp 的.so 动态链接库和.a 动态链接库
make
make install
其中 build/lib 目录下:
├── libspeexdsp.a /* 动态库 */
├── libspeexdsp.la /* 记录同名动静库和动态库相干信息的 la 文本文件 */
├── libspeexdsp.so -> libspeexdsp.so.1.5.2
├── libspeexdsp.so.1 -> libspeexdsp.so.1.5.2 /* 符号链接 */
├── libspeexdsp.so.1.5.2 /* 动静库 */
└── pkgconfig /*pkgconfig 的 *.pc 文件 */
└── speexdsp.pc
linux 下的 so、o、lo、a、la 文件
- o: 编译的指标文件
- a: 动态库,其实就是把若干 o 文件打了个包
- so: 动态链接库(共享库)动静库文件必须以 lib 结尾, 以.so 结尾
- lo: 应用 libtool 编译出的指标文件,其实就是在 o 文件中增加了一些信息
- la: 应用 libtool 编译出的库文件,其实是个文本文件,记录同名动静库和动态库的相干信息
常识拓展:
- 函数库分为 动态库 a 和动静库.so两种:
①动态库在程序编译时会被连贯到指标代码中,程序运行时将不再须要该动态库。
②动静库在程序编译时并不会被连贯到指标代码中,而是在程序运行是才被载入,因而在程序运行时还须要动静库存在。 - 符号链接(symbolic link)是 Linux 零碎中的一种文件,它指向零碎中的另一个文件或目录。符号链接相似于 Windows 零碎中的快捷方式。
- 在 linux 中,*.la 是记录同名动静库和动态库相干信息的文本文件。
三、剖析 speexdsp 在规范 Linux 零碎的编译过程文件
-
剖析 speexdsp 在规范 Linux 零碎的编译过程文件,找到生成 so 库和测试用的可执行文件所需的.c 源代码,头文件门路,cflags 编译器标记,所依赖的库。
比照编译前后的 speexdsp 原生库构造
- tree 工具能以树形的形式显示指定目录的层级构造。
非绿色字体是编译后生成的文件。
├── $\color {#0F0} {acinclude.m4}$
├── $\color {#0F0} {AUTHORS}$ #speexdsp 我的项目作者信息
├── $\color {#0F0} {autogen.sh}$ #autogen.sh 脚本配置文件
├── aclocal.m4 #运行 aclocal 后生成的 aclocal.m4 文件和一个缓冲文件夹 autom4te.cache
├── autom4te.cache
│ ├── output.0
│ ├── output.1
│ ├── output.2
│ ├── requests
│ ├── traces.0
│ ├── traces.1
│ └── traces.2
├── build
│ ├── include
│ │ └── speex
│ │ ├── speexdsp_config_types.h
│ │ ├── speexdsp_types.h
│ │ ├── speex_echo.h
│ │ ├── speex_jitter.h
│ │ ├── speex_preprocess.h
│ │ └── speex_resampler.h
│ ├── lib
│ │ ├── libspeexdsp.a
│ │ ├── libspeexdsp.la
│ │ ├── libspeexdsp.so -> libspeexdsp.so.1.5.2
│ │ ├── libspeexdsp.so.1 -> libspeexdsp.so.1.5.2
│ │ ├── libspeexdsp.so.1.5.2
│ │ └── pkgconfig
│ │ └── speexdsp.pc
│ └── share
│ └── doc
│ └── speexdsp
│ └── manual.pdf
├── $\color {#0F0} {ChangeLog}$#spexxds 原生库更新日志(和本次移植无关信息)├── $\color {#0F0} {compile}$
├── $\color {#0F0} {config.guess}$# 这个是在构建环境上运行的一个脚本,它用来猜想构建机的配置环境,因为这个脚本是在构建机上运行,所以它能够动静执行 uname 等命令来取得构建机的环境,所以咱们个别不要指定这个变量,从而让脚本主动取得。├── config.h#Config.h 是主动生成的头文件,是依据配置文件 Config.h.in 生成的。config.h 次要用于代码移植,产生可移植代码。├── config.h.in#autoheader 后造成 config.h.in
├── config.log# 该文件在执行 configure 文件时动静生成,蕴含了一些行号信息,示意一个文件在哪一行执行,以及执行的什么命令,因而能够晓得测试是在哪个地位中实现。├── $\color {#0F0} {config.status}$# 这是脚本文件,运行该脚本能够生成一个以后雷同的配置,从而防止再次执行 configure 这个比拟宏大的代码。也就是 config.log 生成的是文本文件,而 config.status 生成的则是命令脚本文件。├── $\color {#0F0} {config.sub}$# 这个是将 host target build 变量正则化的一个脚本,它的 sub 就是 substitute 的缩写。因为用户提供的 build 可能并不合乎脚本正规的四元组或者三元组的构造,所以这个脚本将它转换为规范的格局,从而能够进行格式化解决。├── $\color {#0F0} {configure}$# 这个是咱们须要监测环境的次要入口文件,应用该文件能够生成 Makefile 文件,它会替换 Makefile 中须要替换的变量。├── $\color {#0F0} {configure.ac}$# 该文件为 autoconfigure 文件应用的一个文件,该文件用来生成 configure 文件,这个文件个别是开发者保护,咱们装置该软件的时候只须要执行 configure 就能够,这个 configure.ac 咱们个别不必理睬
├── $\color {#0F0} {COPYING}$
├── $\color {#0F0} {depcomp}$#automake --add-missing 命令生成 install-sh, missing, depcomp 文件
├── $\color {#0F0} {doc}$
│ ├── $\color {#0F0} {celp_decoder.eps}$
│ ├── $\color {#0F0} {celp_decoder.odg}$
│ ├── $\color {#0F0} {components.eps}$
│ ├── $\color {#0F0} {components.odg}$
│ ├── $\color {#0F0} {echo_path.eps}$
│ ├── $\color {#0F0} {echo_path.odg}$
│ ├── Makefile
│ ├── $\color {#0F0} {Makefile.am}$
│ ├── Makefile.in
│ ├── $\color {#0F0} {manual.lyx}$
│ ├── $\color {#0F0} {manual.pdf}$
│ ├── $\color {#0F0} {programming.html}$
│ ├── $\color {#0F0} {ref_shaping.eps}$
│ ├── $\color {#0F0} {sampledec.c}$
│ ├── $\color {#0F0} {sampleenc.c}$
│ ├── $\color {#0F0} {speex_abs.eps}$
│ ├── $\color {#0F0} {speex_abs.odg}$
│ ├── $\color {#0F0} {speex_analysis.eps}$
│ └── $\color {#0F0} {speex_analysis.odg}$
├── $\color {#0F0} {Doxyfile}$
├── $\color {#0F0} {html}$
│ ├── $\color {#0F0} {speex.png}$
│ ├── $\color {#0F0} {speex.webprj}$
│ └── $\color {#0F0} {speex.xcf}$
├── $\color {#0F0} {include}$
│ ├── Makefile
│ ├── $\color {#0F0} {Makefile.am}$
│ ├── Makefile.in
│ └── $\color {#0F0} {speex}$
│ ├── Makefile
│ ├── $\color {#0F0} {Makefile.am}$
│ ├── Makefile.in
│ ├── $\color {#0F0} {speex_buffer.h}$
│ ├── speexdsp_config_types.h
│ ├── $\color {#0F0} {speexdsp_config_types.h.in}$
│ ├── $\color {#0F0} {speexdsp_types.h}$
│ ├── $\color {#0F0} {speex_echo.h}$
│ ├── $\color {#0F0} {speex_jitter.h}$
│ ├── $\color {#0F0} {speex_preprocess.h}$
│ └── $\color {#0F0} {speex_resampler.h}$
├── $\color {#0F0} {INSTALL}$
├── $\color {#0F0} {install-sh}$#automake --add-missing 命令生成 install-sh, missing, depcomp 文件
├── $\color {#0F0} {libspeexdsp}$
│ ├── $\color {#0F0} {arch.h}$
│ ├── $\color {#0F0} {bfin.h}$
│ ├── $\color {#0F0} {buffer.c}$
│ ├── buffer.lo
│ ├── buffer.o
│ ├── $\color {#0F0} {echo_diagnostic.m}$
│ ├── $\color {#0F0} {fftwrap.c}$
│ ├── $\color {#0F0} {fftwrap.h}$
│ ├── fftwrap.lo
│ ├── fftwrap.o
│ ├── $\color {#0F0} {filterbank.c}$
│ ├── $\color {#0F0} {filterbank.h}$
│ ├── filterbank.lo
│ ├── filterbank.o
│ ├── $\color {#0F0} {fixed_arm4.h}$
│ ├── $\color {#0F0} {fixed_arm5e.h}$
│ ├── $\color {#0F0} {fixed_bfin.h}$
│ ├── $\color {#0F0} {fixed_debug.h}$
│ ├── $\color {#0F0} {fixed_generic.h}$
│ ├── $\color {#0F0} {jitter.c}$
│ ├── jitter.lo
│ ├── jitter.o
│ ├── $\color {#0F0} {kiss_fft.c}$
│ ├── $\color {#0F0} {_kiss_fft_guts.h}$
│ ├── $\color {#0F0} {kiss_fft.h}$
│ ├── $\color {#0F0} {kiss_fftr.c}$
│ ├── $\color {#0F0} {kiss_fftr.h}$
│ ├── libspeexdsp.la
│ ├── Makefile
│ ├── $\color {#0F0} {Makefile.am}$
│ ├── Makefile.in
│ ├── $\color {#0F0} {math_approx.h}$
│ ├── $\color {#0F0} {mdf.c}$
│ ├── mdf.lo
│ ├── mdf.o
│ ├── $\color {#0F0} {misc_bfin.h}$
│ ├── $\color {#0F0} {os_support.h}$
│ ├── $\color {#0F0} {preprocess.c}$
│ ├── preprocess.lo
│ ├── preprocess.o
│ ├── $\color {#0F0} {pseudofloat.h}$
│ ├── $\color {#0F0} {resample.c}$
│ ├── resample.lo
│ ├── $\color {#0F0} {resample_neon.h}$
│ ├── resample.o
│ ├── $\color {#0F0} {resample_sse.h}$
│ ├── $\color {#0F0} {scal.c}$
│ ├── scal.lo
│ ├── scal.o
│ ├── $\color {#0F0} {smallft.c}$
│ ├── $\color {#0F0} {smallft.h}$
│ ├── smallft.lo
│ ├── smallft.o
│ ├── $\color {#0F0} {testdenoise}$
│ ├── $\color {#0F0} {testdenoise.c}$ #测试乐音克制的文件
│ ├── testdenoise.o
│ ├── $\color {#0F0} {testecho}$
│ ├── $\color {#0F0} {testecho.c}$ #测试声学回音打消的文件
│ ├── testecho.o
│ ├── $\color {#0F0} {testjitter}$ # 测试抖动的文件
│ ├── $\color {#0F0} {testjitter.c}$
│ ├── testjitter.o
│ ├── $\color {#0F0} {testresample}$
│ ├── $\color {#0F0} {testresample2}$
│ ├── $\color {#0F0} {testresample2.c}$# 测试重采样的文件
│ ├── testresample2.o
│ ├── $\color {#0F0} {testresample.c}$# 测试重采样的文件
│ ├── testresample.o
│ └── $\color {#0F0} {vorbis_psy.h}$
├── $\color {#0F0} {libtool}$
├── ltmain.sh
├── m4
│ ├── libtool.m4
│ ├── lt~obsolete.m4
│ ├── ltoptions.m4
│ ├── ltsugar.m4
│ └── ltversion.m4
├── $\color {#0F0} {macosx}$
│ ├── $\color {#0F0} {English.lproj}$
│ │ └── $\color {#0F0} {InfoPlist.strings}$
│ ├── $\color {#0F0} {Info.plist}$
│ ├── $\color {#0F0} {Speex_Prefix.pch}$
│ ├── $\color {#0F0} {Speex_UB.xcodeproj}$
│ │ └── $\color {#0F0} {project.pbxproj}$
│ └── $\color {#0F0} {Speex.xcodeproj}$
│ └── $\color {#0F0} {project.pbxproj}$
├── Makefile
├── $\color {#0F0} {Makefile.am}$
├── Makefile.in
├── $\color {#0F0} {missing}$#automake --add-missing 命令生成 install-sh, missing, depcomp 文件
├── $\color {#0F0} {NEWS}$
├── $\color {#0F0} {README}$
├── $\color {#0F0} {README.blackfin}$# 汇聚式处理器 Blackfin 是由 ADI 和 Intel 公司联合开发的微信号架构(MSA)├── $\color {#0F0} {README.Trimedia}$#Trimedia 是由 Philips 公司 1996 年推出的新一代媒体处理器(Media Processor)芯片。├── $\color {#0F0} {README.win32}$#Win32 是指 Microsoft Windows 操作系统的 32 位环境
├── $\color {#0F0} {regression-fixes}$
│ └── $\color {#0F0} {1-resampler_unsigned_fix.patch}$
├── $\color {#0F0} {regressions}$
├── $\color {#0F0} {SpeexDSP.kdevelop}$
├── speexdsp.pc
├── $\color {#0F0} {speexdsp.pc.in}$
├── SpeexDSP.spec
├── $\color {#0F0} {SpeexDSP.spec.in}$
├── stamp-h1
├── $\color {#0F0} {symbian}$
│ ├── $\color {#0F0} {bld.inf}$
│ ├── $\color {#0F0} {config.h}$
│ ├── Makefile
│ ├── $\color {#0F0} {Makefile.am}$
│ ├── Makefile.in
│ └── $\color {#0F0} {speex.mmp}$
├── $\color {#0F0} {ti}$#TI 公司 DSP 芯片
│ ├── $\color {#0F0} {config.h}$
│ ├── Makefile
│ ├── $\color {#0F0} {Makefile.am}$
│ ├── Makefile.in
│ ├── $\color {#0F0} {os_support_custom.h}$
│ ├── $\color {#0F0} {speex_C54_test}$
│ │ ├── Makefile
│ │ ├── $\color {#0F0} {Makefile.am}$
│ │ ├── Makefile.in
│ │ ├── $\color {#0F0} {speex_C54_test.cmd}$
│ │ └── $\color {#0F0} {speex_C54_test.pjt}$
│ ├── $\color {#0F0} {speex_C55_test}$
│ │ ├── Makefile
│ │ ├── $\color {#0F0} {Makefile.am}$
│ │ ├── Makefile.in
│ │ ├── $\color {#0F0} {speex_C55_test.cmd}$
│ │ └── $\color {#0F0} {speex_C55_test.pjt}$
│ └── $\color {#0F0} {speex_C64_test}$
│ ├── Makefile
│ ├── $\color {#0F0} {Makefile.am}$
│ ├── Makefile.in
│ ├── $\color {#0F0} {speex_C64_test.cmd}$
│ └── $\color {#0F0} {speex_C64_test.pjt}$
├── $\color {#0F0} {tmv}$
│ ├── $\color {#0F0} {config.h}$
│ ├── $\color {#0F0} {fftwrap_tm.h}$
│ ├── $\color {#0F0} {filterbank_tm.h}$
│ ├── $\color {#0F0} {fixed_tm.h}$
│ ├── $\color {#0F0} {_kiss_fft_guts_tm.h}$
│ ├── $\color {#0F0} {kiss_fftr_tm.h}$
│ ├── $\color {#0F0} {kiss_fft_tm.h}$
│ ├── $\color {#0F0} {mdf_tm.h}$
│ ├── $\color {#0F0} {misc_tm.h}$
│ ├── $\color {#0F0} {preprocess_tm.h}$
│ ├── $\color {#0F0} {profile_tm.h}$
│ └── $\color {#0F0} {speex_config_types.h}$
├── $\color {#0F0} {TODO}$
└── $\color {#0F0} {win32}$
├── $\color {#0F0} {config.h}$
├── $\color {#0F0} {libspeexdsp}$
│ ├── $\color {#0F0} {libspeexdsp.dsp}$
│ ├── $\color {#0F0} {libspeexdsp.dsw}$
│ ├── $\color {#0F0} {libspeexdsp_dynamic.dsp}$
│ ├── Makefile
│ ├── $\color {#0F0} {Makefile.am}$
│ └── Makefile.in
├── $\color {#0F0} {libspeexdsp.def}$
├── Makefile
├── $\color {#0F0} {Makefile.am}$
├── Makefile.in
├── $\color {#0F0} {speex.iss}$
├── $\color {#0F0} {VS2003}$
│ ├── $\color {#0F0} {libspeexdsp}$
│ │ ├── $\color {#0F0} {libspeexdsp.vcproj}$
│ │ ├── Makefile
│ │ ├── $\color {#0F0} {Makefile.am}$
│ │ └── Makefile.in
│ ├── $\color {#0F0} {libspeexdsp.sln}$
│ ├── Makefile
│ ├── $\color {#0F0} {Makefile.am}$
│ ├── Makefile.in
│ └── $\color {#0F0} {tests}$
│ ├── Makefile
│ ├── $\color {#0F0} {Makefile.am}$
│ ├── Makefile.in
│ ├── $\color {#0F0} {testdenoise.vcproj}$
│ ├── $\color {#0F0} {testecho.vcproj}$
│ └── $\color {#0F0} {testresample.vcproj}$
├── $\color {#0F0} {VS2005}$
│ ├── $\color {#0F0} {libspeexdsp}$
│ │ ├── $\color {#0F0} {libspeexdsp.vcproj}$
│ │ ├── Makefile
│ │ ├── $\color {#0F0} {Makefile.am}$
│ │ └── Makefile.in
│ ├── $\color {#0F0} {libspeexdsp.sln}$
│ ├── Makefile
│ ├── $\color {#0F0} {Makefile.am}$
│ ├── Makefile.in
│ └── $\color {#0F0} {tests}$
│ ├── Makefile
│ ├── $\color {#0F0} {Makefile.am}$
│ ├── Makefile.in
│ ├── $\color {#0F0} {testdenoise.vcproj}$
│ ├── $\color {#0F0} {testecho.vcproj}$
│ └── $\color {#0F0} {testresample.vcproj}$
└── $\color {#0F0} {VS2008}$
├── $\color {#0F0} {libspeexdsp}$
│ ├── $\color {#0F0} {libspeexdsp.vcproj}$
│ ├── Makefile
│ ├── $\color {#0F0} {Makefile.am}$
│ └── Makefile.in
├── $\color {#0F0} {libspeexdsp.sln}$
├── Makefile
├── $\color {#0F0} {Makefile.am}$
├── Makefile.in
└── $\color {#0F0} {tests}$
├── Makefile
├── $\color {#0F0} {Makefile.am}$
├── Makefile.in
├── $\color {#0F0} {testdenoise.vcproj}$
├── $\color {#0F0} {testecho.vcproj}$
└── $\color {#0F0} {testresample.vcproj}$**
剖析原生库下 make.am 文件
- make.am 是一种比 Makefile 文件形象程序更高的编译规定文件。在外面能够指定生成目录,编译用的源码,编译的时候依赖哪些库,要装置到什么目录。
原生库根目录下的 make.am 如下
## Process this file with automake to produce Makefile.in. -*-Makefile-*-
# To disable automatic dependency tracking if using other tools than
# gcc and gmake, add the option 'no-dependencies'
AUTOMAKE_OPTIONS = 1.8
ACLOCAL_AMFLAGS = -I m4
pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = speexdsp.pc
EXTRA_DIST = SpeexDSP.spec SpeexDSP.spec.in SpeexDSP.kdevelop speexdsp.pc.in README.blackfin
#Fools KDevelop into including all files
SUBDIRS = libspeexdsp include doc win32 symbian ti
DIST_SUBDIRS = libspeexdsp include doc win32 symbian ti
rpm: dist
rpmbuild -ta ${PACKAGE}-${VERSION}.tar.gz
父目录须要蕴含子目录,在父目录下的 Makefile.am 中须要增加: SUBDIRS = 子目录。可知 speexdsp 子目录为 libspeexdsp include doc win32 symbian ti。再逐渐查看各个文件夹源码可知只有 libspeexdsp
include
文件夹与本次移植无关。所以接下来查看 libspeexdsp 目录下的 make.am 文件
子目录 libspeexdsp 下的 make.am
# Disable automatic dependency tracking if using other tools than gcc and gmake
#AUTOMAKE_OPTIONS = no-dependencies
EXTRA_DIST=echo_diagnostic.m
AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/include/speex -I$(top_builddir) @[email protected]
/*top_srcdir 工程最顶层目录 */
/*top_builddir 定义生成指标文件的最上层目录 */
lib_LTLIBRARIES = libspeexdsp.la
# Sources for compilation in the library
if BUILD_KISS_FFT
FFTSRC=kiss_fft.c _kiss_fft_guts.h kiss_fft.h kiss_fftr.c kiss_fftr.h
else
if BUILD_SMALLFT
FFTSRC=smallft.c
else
FFTSRC=
endif
endif
libspeexdsp_la_SOURCES = preprocess.c jitter.c mdf.c fftwrap.c filterbank.c resample.c buffer.c
scal.c $(FFTSRC)/* 编译 libspeexdsp.so 须要 preprocess.c jitter.c mdf.c fftwrap.c filterbank.c resample.c
buffer.c scal.c、smallft.c 源文件(特地须要留神 $(FFTSRC)的存在,因为 FFTSRC=smallft.c)*/
/*noinst_HEADERS:这个示意该头文件只是加入可执行文件的编译, 而不必装置到装置目录下。如果须要装置到零碎中, 能够用 include_HEADERS 来代替。*/
noinst_HEADERS = arch.h bfin.h \
fixed_arm4.h \
fixed_arm5e.h fixed_bfin.h fixed_debug.h \
math_approx.h misc_bfin.h \
fftwrap.h \
filterbank.h fixed_generic.h os_support.h \
pseudofloat.h smallft.h vorbis_psy.h resample_sse.h resample_neon.h
libspeexdsp_la_LDFLAGS = -no-undefined -version-info/*LDFLAGS: 编译时的选项 */ @[email protected]:@[email protected]:@[email protected]
libspeexdsp_la_LIBADD = $(LIBM)
if BUILD_EXAMPLES /* 编译测试文件 */
noinst_PROGRAMS = testdenoise testecho testjitter testresample testresample2
testdenoise_SOURCES = testdenoise.c
testdenoise_LDADD = [email protected][email protected] /* 链接须要 libspeexdsp.la 库文件 */
testecho_SOURCES = testecho.c /* 须要的
testecho_LDADD = libspeexdsp.la @[email protected] /* 链接须要 libspeexdsp.la 库文件 */
testjitter_SOURCES = testjitter.c
testjitter_LDADD = libspeexdsp.la @[email protected] /* 链接须要 libspeexdsp.la 库文件 */
testresample_SOURCES = testresample.c
testresample_LDADD = libspeexdsp.la @[email protected] @[email protected] /* 链接须要 libspeexdsp.la 库文件 */
testresample2_SOURCES = testresample2.c
testresample2_LDADD = libspeexdsp.la @[email protected] @[email protected] /* 链接须要 libspeexdsp.la 库文件 */
endif
通过剖析 libspeexdsp 下的 make.am 能够晓得:
- 编译出 so 库须要的.c 源文件有 preprocess.c jitter.c mdf.c fftwrap.c filterbank.c resample.c
buffer.c scal.c、smallft.c - 编译出 so 库须要的.h 源文件有 arch.h bfin.h fixed_arm4.h fixed_arm5e.h fixed_bfin.h fixed_debug.h math_approx.h misc_bfin.h fftwrap.h filterbank.h fixed_generic.h os_support.h pseudofloat.h smallft.h vorbis_psy.h resample_sse.h resample_neon.h
- 编译出测试用的 testdenoise testecho testjitter testresample testresample2 可执行文件须要的.c 源文件有 testdenoise.c testec.c hotestjitter.c testresample.c testresample2.c
剖析原生库下 Makefile 文件
Makefile 里有什么?Makefile 里次要蕴含了五个货色:显式规定、费解规定、变量定义、文件批示和正文。
- 显式规定。显式规定阐明了如何生成一个或多个指标文件。这是由 Makefile 的书写者显著指出要生成的文件、文件的依赖文件和生成的命令。
- 费解规定。因为咱们的 make 有主动推导的性能,所以费解的规定能够让咱们比拟简略地书写 Makefile,这是由 make 所反对的。
- 变量的定义。在 Makefile 中咱们要定义一系列的变量,变量个别都是字符串,这个有点像你 C 语言中的宏,当 Makefile 被执行时,其中的变量都会被扩大到相应的援用地位上。
- 文件批示。其包含了三个局部,一个是在一个 Makefile 中援用另一个 Makefile,就像 C 语言中的 include 一样;另一个是指依据某些状况指定 Makefile 中的无效局部,就像 C 语言中的预编译 #if 一样;还有就是定义一个多行的命令。无关这一部分的内容,我会在后续的局部中讲述。
- 正文。Makefile 中只有行正文,和 UNIX 的 Shell 脚本一样,其正文是用 # 字符,这个就像 C /C++ 中的 // 一样。如果你要在你的 Makefile 中应用 # 字符,能够用反斜杠进行本义,如:#。
笔者在 speexdsp 根目录下的 makefile(最根本的 Makefile)文件中
搜寻关键字 CFLAGS
找到 CFLAGS = -g -O2 -fvisibility=hidden 这条语句
剖析“make”过程 log
以下是执行 make 命令后在终端显示的局部 log, 通过剖析也能够晓得编译 so 库须要的.c 文件均位于 libspeexdsp 目录。
[email protected]:~/Desktop/speexdsp-SpeexDSP-1.2.1$ make
make all-recursive
make[1]: 进入目录“/home/jiajiahao/Desktop/speexdsp-SpeexDSP-1.2.1”Making all in libspeexdsp
make[2]: 进入目录“/home/jiajiahao/Desktop/speexdsp-SpeexDSP-1.2.1/libspeexdsp”CC preprocess.lo
CC jitter.lo
CC mdf.lo
CC fftwrap.lo
CC filterbank.lo
CC resample.lo
CC buffer.lo
CC scal.lo
CC smallft.lo
CCLD libspeexdsp.la
make[2]: 来到目录“/home/jiajiahao/Desktop/speexdsp-SpeexDSP-1.2.1/libspeexdsp”
剖析 build 装置目录下生成的.pc 文件
下图为 build/lib/pkgconfig 目录的 speexdsp.pc 文件
*.pc 文件的所有参数:
Name: 该模块的名字,比方你的 pc 名字是 xxxx.pc,那么名字最好也是 xxxx。
Description: 模块的简略形容。上文 pkg-config –list-all 命令进去的后果,每个名字前面就是 description。
URL: 用户能够通过该 URL 取得更多信息,或者下载信息。也是辅助的,可要可不要。
Version: 版本号。
Requires: 该模块有木有依赖于其余模块。个别没有。
Requires.private: 该模块有木有依赖于其余模块,并且还不须要第三方晓得的。个别也没有。
Conflicts: 有没有和别的模块抵触。罕用于版本抵触。比方,Conflicts: bar < 1.2.3,示意和 bar 模块的 1.2.3 以下的版本有抵触。
Cflags: 这个就很重要了。pkg-config 的参数–cflags 就指向这里。次要用于写本模块的头文件的门路。
Libs: 也很重要,pkg-config 的参数–libs 就指向这里。次要用于写本模块的库 / 依赖库的门路。
Libs.private: 本模块依赖的库,但不须要第三方晓得。
在文件中的第 14 行中分明的指出 speexdsp 依赖 -lm 这个库。
剖析运行 configure 命令后生成的 config.log
从中也能够剖析出 speexdsp 依赖的库-lm
和编译器须要增加的 C_FLAGS 标记-g -O2 -fvisibility=hidden
configure:9932: checking for cos in -lm
configure:9957: gcc -o conftest -g -O2 -fvisibility=hidden conftest.c -lm >&5
论断
- speexdsp 依赖的库为 -lm
- 编译出 speexdsp 动态链接库须要的.c 源文件为 preprocess.c jitter.c mdf.c fftwrap.c filterbank.c resample.c buffer.c scal.c、smallft.c。
- 编译出 speexdsp 动态链接库须要的.h 源文件目录为 libspeexdsp
- 编译出测试用的 testdenoise testecho testjitter testresample testresample2 可执行文件须要的.c 源文件有 testdenoise.c testec.c hotestjitter.c testresample.c testresample2.c
- 编译出测试用的 testdenoise testecho testjitter testresample testresample2 可执行文件须要的.h 源文件目录为根目录下 include
- 编译时须要增加的 cflags 编译器标记为
-o
-g
-O2
-fvisibility=hidden
。