• 大家好!我来自南京,在OpenHarmony成长打算啃论文俱乐部,与华为、软通能源、润和软件、拓维信息、深开鸿等公司一起,学习和钻研操作系统技术
    从往年1月11日退出OpenHarmony俱乐部曾经有靠近8个月工夫了。笔者始终在思考啃论文给我带来了些什么,通过啃论文能为OpenHarmony做些什么。笔者利用大二升大三寒假两个月工夫移植了Speexdsp这个三方库到OpenHarmony规范零碎,而对于后面的问题我仿佛找到了答案,现将啃论文和三方库移植分享教训如下:

因为想要分享的内容较多,为防止读者姥爷们失去看上来的急躁,分享将以连载的形式进行。

本期为移植speexdsp到OpenHarmony规范零碎的第②期,次要内容如下:


在linux上生成speexdsp的so动态链接库和.a动态链接库

  • make和make install后会生成speexdsp的.so动态链接库和.a动态链接库
makemake 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.8ACLOCAL_AMFLAGS = -I m4pkgconfigdir = $(libdir)/pkgconfigpkgconfig_DATA = speexdsp.pcEXTRA_DIST = SpeexDSP.spec SpeexDSP.spec.in SpeexDSP.kdevelop speexdsp.pc.in README.blackfin#Fools KDevelop into including all filesSUBDIRS = libspeexdsp include doc win32 symbian ti   DIST_SUBDIRS = libspeexdsp include doc win32 symbian tirpm: 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-dependenciesEXTRA_DIST=echo_diagnostic.mAM_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 libraryif BUILD_KISS_FFT  FFTSRC=kiss_fft.c _kiss_fft_guts.h kiss_fft.h kiss_fftr.c kiss_fftr.h elseif BUILD_SMALLFT  FFTSRC=smallft.celse  FFTSRC=endifendiflibspeexdsp_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.hlibspeexdsp_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 testresample2testdenoise_SOURCES = testdenoise.ctestdenoise_LDADD = [email protected][email protected] /*链接须要libspeexdsp.la库文件*/testecho_SOURCES = testecho.c /*须要的testecho_LDADD = libspeexdsp.la @[email protected] /*链接须要libspeexdsp.la库文件*/testjitter_SOURCES = testjitter.ctestjitter_LDADD = libspeexdsp.la @[email protected] /*链接须要libspeexdsp.la库文件*/testresample_SOURCES = testresample.ctestresample_LDADD = libspeexdsp.la @[email protected] @[email protected] /*链接须要libspeexdsp.la库文件*/testresample2_SOURCES = testresample2.ctestresample2_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$ makemake  all-recursivemake[1]: 进入目录“/home/jiajiahao/Desktop/speexdsp-SpeexDSP-1.2.1”Making all in libspeexdspmake[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.lamake[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 -lmconfigure: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

下期分享内容:将三方库退出到OpenHarmony的编译体系