啃论文俱乐部——移植speexdsp到OpenHarmony标准系统②

  • 大家好!我来自南京,在OpenHarmony成长计划啃论文俱乐部,与华为、软通动力、润和软件、拓维信息、深开鸿等公司一起,学习和研究操作系统技术
    从今年1月11日加入OpenHarmony俱乐部已经有接近8个月时间了。笔者一直在思考啃论文给我带来了些什么,通过啃论文能为OpenHarmony做些什么。笔者利用大二升大三暑假两个月时间移植了Speexdsp这个三方库到OpenHarmony标准系统,而关于前面的问题我似乎找到了答案,现将啃论文和三方库移植分享经验如下:

由于想要分享的内容较多,为避免读者姥爷们失去看下去的耐心,分享将以连载的方式进行。

本期为移植speexdsp到OpenHarmony标准系统的第②期,主要内容如下:

image.png


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

  • make和make install后会生成speexdsp的.so动态链接库和.a静态链接库
make
make install

image.png

其中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工具能以树形的方式显示指定目录的层级结构。
    非绿色字体是编译后生成的文件。

├── a c i n c l u d e . m 4 \color {#0F0} {acinclude.m4} acinclude.m4
├── A U T H O R S \color {#0F0} {AUTHORS} AUTHORS #speexdsp项目作者信息
├── a u t o g e n . s h \color {#0F0} {autogen.sh} 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
├── C h a n g e L o g \color {#0F0} {ChangeLog} ChangeLog#spexxds原生库更新日志(和本次移植无关信息)
├── c o m p i l e \color {#0F0} {compile} compile
├── c o n f i g . g u e s s \color {#0F0} {config.guess} config.guess#这个是在构建环境上运行的一个脚本,它用来猜测构建机的配置环境,因为这个脚本是在构建机上运行,所以它可以动态执行uname等命令来获得构建机的环境,所以我们一般不要指定这个变量,从而让脚本自动获得。
├── config.h#Config.h是自动生成的头文件,是根据配置文件Config.h.in生成的。config.h主要用于代码移植,产生可移植代码。
├── config.h.in#autoheader后形成config.h.in
├── config.log#该文件在执行configure文件时动态生成,包含了一些行号信息,表示一个文件在哪一行执行,以及执行的什么命令,因此可以知道测试是在哪个位置中完成。
├── c o n f i g . s t a t u s \color {#0F0} {config.status} config.status#这是脚本文件,运行该脚本可以生成一个当前相同的配置,从而避免再次执行configure这个比较庞大的代码。也就是config.log生成的是文本文件,而config.status生成的则是命令脚本文件。
├── c o n f i g . s u b \color {#0F0} {config.sub} config.sub#这个是将host target build变量正则化的一个脚本,它的sub就是substitute的缩写。因为用户提供的build可能并不符合脚本正规的四元组或者三元组的结构,所以这个脚本将它转换为标准的格式,从而可以进行格式化处理。
├── c o n f i g u r e \color {#0F0} {configure} configure#这个是我们需要监测环境的主要入口文件,使用该文件可以生成Makefile文件,它会替换Makefile中需要替换的变量。
├── c o n f i g u r e . a c \color {#0F0} {configure.ac} configure.ac#该文件为autoconfigure文件使用的一个文件,该文件用来生成configure文件,这个文件一般是开发者维护,我们安装该软件的时候只需要执行configure就可以,这个configure.ac我们一般不用理会
├── C O P Y I N G \color {#0F0} {COPYING} COPYING
├── d e p c o m p \color {#0F0} {depcomp} depcomp#automake --add-missing命令生成install-sh, missing, depcomp文件
├── d o c \color {#0F0} {doc} doc
│ ├── c e l p d e c o d e r . e p s \color {#0F0} {celp_decoder.eps} celpdecoder.eps
│ ├── c e l p d e c o d e r . o d g \color {#0F0} {celp_decoder.odg} celpdecoder.odg
│ ├── c o m p o n e n t s . e p s \color {#0F0} {components.eps} components.eps
│ ├── c o m p o n e n t s . o d g \color {#0F0} {components.odg} components.odg
│ ├── e c h o p a t h . e p s \color {#0F0} {echo_path.eps} echopath.eps
│ ├── e c h o p a t h . o d g \color {#0F0} {echo_path.odg} echopath.odg
│ ├── Makefile
│ ├── M a k e f i l e . a m \color {#0F0} {Makefile.am} Makefile.am
│ ├── Makefile.in
│ ├── m a n u a l . l y x \color {#0F0} {manual.lyx} manual.lyx
│ ├── m a n u a l . p d f \color {#0F0} {manual.pdf} manual.pdf
│ ├── p r o g r a m m i n g . h t m l \color {#0F0} {programming.html} programming.html
│ ├── r e f s h a p i n g . e p s \color {#0F0} {ref_shaping.eps} refshaping.eps
│ ├── s a m p l e d e c . c \color {#0F0} {sampledec.c} sampledec.c
│ ├── s a m p l e e n c . c \color {#0F0} {sampleenc.c} sampleenc.c
│ ├── s p e e x a b s . e p s \color {#0F0} {speex_abs.eps} speexabs.eps
│ ├── s p e e x a b s . o d g \color {#0F0} {speex_abs.odg} speexabs.odg
│ ├── s p e e x a n a l y s i s . e p s \color {#0F0} {speex_analysis.eps} speexanalysis.eps
│ └── s p e e x a n a l y s i s . o d g \color {#0F0} {speex_analysis.odg} speexanalysis.odg
├── D o x y f i l e \color {#0F0} {Doxyfile} Doxyfile
├── h t m l \color {#0F0} {html} html
│ ├── s p e e x . p n g \color {#0F0} {speex.png} speex.png
│ ├── s p e e x . w e b p r j \color {#0F0} {speex.webprj} speex.webprj
│ └── s p e e x . x c f \color {#0F0} {speex.xcf} speex.xcf
├── i n c l u d e \color {#0F0} {include} include
│ ├── Makefile
│ ├── M a k e f i l e . a m \color {#0F0} {Makefile.am} Makefile.am
│ ├── Makefile.in
│ └── s p e e x \color {#0F0} {speex} speex
│ ├── Makefile
│ ├── M a k e f i l e . a m \color {#0F0} {Makefile.am} Makefile.am
│ ├── Makefile.in
│ ├── s p e e x b u f f e r . h \color {#0F0} {speex_buffer.h} speexbuffer.h
│ ├── speexdsp_config_types.h
│ ├── s p e e x d s p c o n f i g t y p e s . h . i n \color {#0F0} {speexdsp_config_types.h.in} speexdspconfigtypes.h.in
│ ├── s p e e x d s p t y p e s . h \color {#0F0} {speexdsp_types.h} speexdsptypes.h
│ ├── s p e e x e c h o . h \color {#0F0} {speex_echo.h} speexecho.h
│ ├── s p e e x j i t t e r . h \color {#0F0} {speex_jitter.h} speexjitter.h
│ ├── s p e e x p r e p r o c e s s . h \color {#0F0} {speex_preprocess.h} speexpreprocess.h
│ └── s p e e x r e s a m p l e r . h \color {#0F0} {speex_resampler.h} speexresampler.h
├── I N S T A L L \color {#0F0} {INSTALL} INSTALL
├── i n s t a l l − s h \color {#0F0} {install-sh} installsh#automake --add-missing命令生成install-sh, missing, depcomp文件
├── l i b s p e e x d s p \color {#0F0} {libspeexdsp} libspeexdsp
│ ├── a r c h . h \color {#0F0} {arch.h} arch.h
│ ├── b f i n . h \color {#0F0} {bfin.h} bfin.h
│ ├── b u f f e r . c \color {#0F0} {buffer.c} buffer.c
│ ├── buffer.lo
│ ├── buffer.o
│ ├── e c h o d i a g n o s t i c . m \color {#0F0} {echo_diagnostic.m} echodiagnostic.m
│ ├── f f t w r a p . c \color {#0F0} {fftwrap.c} fftwrap.c
│ ├── f f t w r a p . h \color {#0F0} {fftwrap.h} fftwrap.h
│ ├── fftwrap.lo
│ ├── fftwrap.o
│ ├── f i l t e r b a n k . c \color {#0F0} {filterbank.c} filterbank.c
│ ├── f i l t e r b a n k . h \color {#0F0} {filterbank.h} filterbank.h
│ ├── filterbank.lo
│ ├── filterbank.o
│ ├── f i x e d a r m 4. h \color {#0F0} {fixed_arm4.h} fixedarm4.h
│ ├── f i x e d a r m 5 e . h \color {#0F0} {fixed_arm5e.h} fixedarm5e.h
│ ├── f i x e d b f i n . h \color {#0F0} {fixed_bfin.h} fixedbfin.h
│ ├── f i x e d d e b u g . h \color {#0F0} {fixed_debug.h} fixeddebug.h
│ ├── f i x e d g e n e r i c . h \color {#0F0} {fixed_generic.h} fixedgeneric.h
│ ├── j i t t e r . c \color {#0F0} {jitter.c} jitter.c
│ ├── jitter.lo
│ ├── jitter.o
│ ├── k i s s f f t . c \color {#0F0} {kiss_fft.c} kissfft.c
│ ├── k i s s f f t g u t s . h \color {#0F0} {_kiss_fft_guts.h} kissfftguts.h
│ ├── k i s s f f t . h \color {#0F0} {kiss_fft.h} kissfft.h
│ ├── k i s s f f t r . c \color {#0F0} {kiss_fftr.c} kissfftr.c
│ ├── k i s s f f t r . h \color {#0F0} {kiss_fftr.h} kissfftr.h
│ ├── libspeexdsp.la
│ ├── Makefile
│ ├── M a k e f i l e . a m \color {#0F0} {Makefile.am} Makefile.am
│ ├── Makefile.in
│ ├── m a t h a p p r o x . h \color {#0F0} {math_approx.h} mathapprox.h
│ ├── m d f . c \color {#0F0} {mdf.c} mdf.c
│ ├── mdf.lo
│ ├── mdf.o
│ ├── m i s c b f i n . h \color {#0F0} {misc_bfin.h} miscbfin.h
│ ├── o s s u p p o r t . h \color {#0F0} {os_support.h} ossupport.h
│ ├── p r e p r o c e s s . c \color {#0F0} {preprocess.c} preprocess.c
│ ├── preprocess.lo
│ ├── preprocess.o
│ ├── p s e u d o f l o a t . h \color {#0F0} {pseudofloat.h} pseudofloat.h
│ ├── r e s a m p l e . c \color {#0F0} {resample.c} resample.c
│ ├── resample.lo
│ ├── r e s a m p l e n e o n . h \color {#0F0} {resample_neon.h} resampleneon.h
│ ├── resample.o
│ ├── r e s a m p l e s s e . h \color {#0F0} {resample_sse.h} resamplesse.h
│ ├── s c a l . c \color {#0F0} {scal.c} scal.c
│ ├── scal.lo
│ ├── scal.o
│ ├── s m a l l f t . c \color {#0F0} {smallft.c} smallft.c
│ ├── s m a l l f t . h \color {#0F0} {smallft.h} smallft.h
│ ├── smallft.lo
│ ├── smallft.o
│ ├── t e s t d e n o i s e \color {#0F0} {testdenoise} testdenoise
│ ├── t e s t d e n o i s e . c \color {#0F0} {testdenoise.c} testdenoise.c #测试噪音抑制的文件
│ ├── testdenoise.o
│ ├── t e s t e c h o \color {#0F0} {testecho} testecho
│ ├── t e s t e c h o . c \color {#0F0} {testecho.c} testecho.c #测试声学回音消除的文件
│ ├── testecho.o
│ ├── t e s t j i t t e r \color {#0F0} {testjitter} testjitter # 测试抖动的文件
│ ├── t e s t j i t t e r . c \color {#0F0} {testjitter.c} testjitter.c
│ ├── testjitter.o
│ ├── t e s t r e s a m p l e \color {#0F0} {testresample} testresample
│ ├── t e s t r e s a m p l e 2 \color {#0F0} {testresample2} testresample2
│ ├── t e s t r e s a m p l e 2. c \color {#0F0} {testresample2.c} testresample2.c#测试重采样的文件
│ ├── testresample2.o
│ ├── t e s t r e s a m p l e . c \color {#0F0} {testresample.c} testresample.c#测试重采样的文件
│ ├── testresample.o
│ └── v o r b i s p s y . h \color {#0F0} {vorbis_psy.h} vorbispsy.h
├── l i b t o o l \color {#0F0} {libtool} libtool
├── ltmain.sh
├── m4
│ ├── libtool.m4
│ ├── lt~obsolete.m4
│ ├── ltoptions.m4
│ ├── ltsugar.m4
│ └── ltversion.m4
├── m a c o s x \color {#0F0} {macosx} macosx
│ ├── E n g l i s h . l p r o j \color {#0F0} {English.lproj} English.lproj
│ │ └── I n f o P l i s t . s t r i n g s \color {#0F0} {InfoPlist.strings} InfoPlist.strings
│ ├── I n f o . p l i s t \color {#0F0} {Info.plist} Info.plist
│ ├── S p e e x P r e f i x . p c h \color {#0F0} {Speex_Prefix.pch} SpeexPrefix.pch
│ ├── S p e e x U B . x c o d e p r o j \color {#0F0} {Speex_UB.xcodeproj} SpeexUB.xcodeproj
│ │ └── p r o j e c t . p b x p r o j \color {#0F0} {project.pbxproj} project.pbxproj
│ └── S p e e x . x c o d e p r o j \color {#0F0} {Speex.xcodeproj} Speex.xcodeproj
│ └── p r o j e c t . p b x p r o j \color {#0F0} {project.pbxproj} project.pbxproj
├── Makefile
├── M a k e f i l e . a m \color {#0F0} {Makefile.am} Makefile.am
├── Makefile.in
├── m i s s i n g \color {#0F0} {missing} missing#automake --add-missing命令生成install-sh, missing, depcomp文件
├── N E W S \color {#0F0} {NEWS} NEWS
├── R E A D M E \color {#0F0} {README} README
├── R E A D M E . b l a c k f i n \color {#0F0} {README.blackfin} README.blackfin#汇聚式处理器Blackfin是由ADI和Intel公司联合开发的微信号架构(MSA)
├── R E A D M E . T r i m e d i a \color {#0F0} {README.Trimedia} README.Trimedia#Trimedia 是由Philips公司1996年推出的新一代媒体处理器(Media Processor)芯片。
├── R E A D M E . w i n 32 \color {#0F0} {README.win32} README.win32#Win32是指Microsoft Windows操作系统的32位环境
├── r e g r e s s i o n − f i x e s \color {#0F0} {regression-fixes} regressionfixes
│ └── 1 − r e s a m p l e r u n s i g n e d f i x . p a t c h \color {#0F0} {1-resampler_unsigned_fix.patch} 1resamplerunsignedfix.patch
├── r e g r e s s i o n s \color {#0F0} {regressions} regressions
├── S p e e x D S P . k d e v e l o p \color {#0F0} {SpeexDSP.kdevelop} SpeexDSP.kdevelop
├── speexdsp.pc
├── s p e e x d s p . p c . i n \color {#0F0} {speexdsp.pc.in} speexdsp.pc.in
├── SpeexDSP.spec
├── S p e e x D S P . s p e c . i n \color {#0F0} {SpeexDSP.spec.in} SpeexDSP.spec.in
├── stamp-h1
├── s y m b i a n \color {#0F0} {symbian} symbian
│ ├── b l d . i n f \color {#0F0} {bld.inf} bld.inf
│ ├── c o n f i g . h \color {#0F0} {config.h} config.h
│ ├── Makefile
│ ├── M a k e f i l e . a m \color {#0F0} {Makefile.am} Makefile.am
│ ├── Makefile.in
│ └── s p e e x . m m p \color {#0F0} {speex.mmp} speex.mmp
├── t i \color {#0F0} {ti} ti#TI公司DSP芯片
│ ├── c o n f i g . h \color {#0F0} {config.h} config.h
│ ├── Makefile
│ ├── M a k e f i l e . a m \color {#0F0} {Makefile.am} Makefile.am
│ ├── Makefile.in
│ ├── o s s u p p o r t c u s t o m . h \color {#0F0} {os_support_custom.h} ossupportcustom.h
│ ├── s p e e x C 5 4 t e s t \color {#0F0} {speex_C54_test} speexC54test
│ │ ├── Makefile
│ │ ├── M a k e f i l e . a m \color {#0F0} {Makefile.am} Makefile.am
│ │ ├── Makefile.in
│ │ ├── s p e e x C 5 4 t e s t . c m d \color {#0F0} {speex_C54_test.cmd} speexC54test.cmd
│ │ └── s p e e x C 5 4 t e s t . p j t \color {#0F0} {speex_C54_test.pjt} speexC54test.pjt
│ ├── s p e e x C 5 5 t e s t \color {#0F0} {speex_C55_test} speexC55test
│ │ ├── Makefile
│ │ ├── M a k e f i l e . a m \color {#0F0} {Makefile.am} Makefile.am
│ │ ├── Makefile.in
│ │ ├── s p e e x C 5 5 t e s t . c m d \color {#0F0} {speex_C55_test.cmd} speexC55test.cmd
│ │ └── s p e e x C 5 5 t e s t . p j t \color {#0F0} {speex_C55_test.pjt} speexC55test.pjt
│ └── s p e e x C 6 4 t e s t \color {#0F0} {speex_C64_test} speexC64test
│ ├── Makefile
│ ├── M a k e f i l e . a m \color {#0F0} {Makefile.am} Makefile.am
│ ├── Makefile.in
│ ├── s p e e x C 6 4 t e s t . c m d \color {#0F0} {speex_C64_test.cmd} speexC64test.cmd
│ └── s p e e x C 6 4 t e s t . p j t \color {#0F0} {speex_C64_test.pjt} speexC64test.pjt
├── t m v \color {#0F0} {tmv} tmv
│ ├── c o n f i g . h \color {#0F0} {config.h} config.h
│ ├── f f t w r a p t m . h \color {#0F0} {fftwrap_tm.h} fftwraptm.h
│ ├── f i l t e r b a n k t m . h \color {#0F0} {filterbank_tm.h} filterbanktm.h
│ ├── f i x e d t m . h \color {#0F0} {fixed_tm.h} fixedtm.h
│ ├── k i s s f f t g u t s t m . h \color {#0F0} {_kiss_fft_guts_tm.h} kissfftgutstm.h
│ ├── k i s s f f t r t m . h \color {#0F0} {kiss_fftr_tm.h} kissfftrtm.h
│ ├── k i s s f f t t m . h \color {#0F0} {kiss_fft_tm.h} kissffttm.h
│ ├── m d f t m . h \color {#0F0} {mdf_tm.h} mdftm.h
│ ├── m i s c t m . h \color {#0F0} {misc_tm.h} misctm.h
│ ├── p r e p r o c e s s t m . h \color {#0F0} {preprocess_tm.h} preprocesstm.h
│ ├── p r o f i l e t m . h \color {#0F0} {profile_tm.h} profiletm.h
│ └── s p e e x c o n f i g t y p e s . h \color {#0F0} {speex_config_types.h} speexconfigtypes.h
├── T O D O \color {#0F0} {TODO} TODO
└── w i n 32 \color {#0F0} {win32} win32
├── c o n f i g . h \color {#0F0} {config.h} config.h
├── l i b s p e e x d s p \color {#0F0} {libspeexdsp} libspeexdsp
│ ├── l i b s p e e x d s p . d s p \color {#0F0} {libspeexdsp.dsp} libspeexdsp.dsp
│ ├── l i b s p e e x d s p . d s w \color {#0F0} {libspeexdsp.dsw} libspeexdsp.dsw
│ ├── l i b s p e e x d s p d y n a m i c . d s p \color {#0F0} {libspeexdsp_dynamic.dsp} libspeexdspdynamic.dsp
│ ├── Makefile
│ ├── M a k e f i l e . a m \color {#0F0} {Makefile.am} Makefile.am
│ └── Makefile.in
├── l i b s p e e x d s p . d e f \color {#0F0} {libspeexdsp.def} libspeexdsp.def
├── Makefile
├── M a k e f i l e . a m \color {#0F0} {Makefile.am} Makefile.am
├── Makefile.in
├── s p e e x . i s s \color {#0F0} {speex.iss} speex.iss
├── V S 2003 \color {#0F0} {VS2003} VS2003
│ ├── l i b s p e e x d s p \color {#0F0} {libspeexdsp} libspeexdsp
│ │ ├── l i b s p e e x d s p . v c p r o j \color {#0F0} {libspeexdsp.vcproj} libspeexdsp.vcproj
│ │ ├── Makefile
│ │ ├── M a k e f i l e . a m \color {#0F0} {Makefile.am} Makefile.am
│ │ └── Makefile.in
│ ├── l i b s p e e x d s p . s l n \color {#0F0} {libspeexdsp.sln} libspeexdsp.sln
│ ├── Makefile
│ ├── M a k e f i l e . a m \color {#0F0} {Makefile.am} Makefile.am
│ ├── Makefile.in
│ └── t e s t s \color {#0F0} {tests} tests
│ ├── Makefile
│ ├── M a k e f i l e . a m \color {#0F0} {Makefile.am} Makefile.am
│ ├── Makefile.in
│ ├── t e s t d e n o i s e . v c p r o j \color {#0F0} {testdenoise.vcproj} testdenoise.vcproj
│ ├── t e s t e c h o . v c p r o j \color {#0F0} {testecho.vcproj} testecho.vcproj
│ └── t e s t r e s a m p l e . v c p r o j \color {#0F0} {testresample.vcproj} testresample.vcproj
├── V S 2005 \color {#0F0} {VS2005} VS2005
│ ├── l i b s p e e x d s p \color {#0F0} {libspeexdsp} libspeexdsp
│ │ ├── l i b s p e e x d s p . v c p r o j \color {#0F0} {libspeexdsp.vcproj} libspeexdsp.vcproj
│ │ ├── Makefile
│ │ ├── M a k e f i l e . a m \color {#0F0} {Makefile.am} Makefile.am
│ │ └── Makefile.in
│ ├── l i b s p e e x d s p . s l n \color {#0F0} {libspeexdsp.sln} libspeexdsp.sln
│ ├── Makefile
│ ├── M a k e f i l e . a m \color {#0F0} {Makefile.am} Makefile.am
│ ├── Makefile.in
│ └── t e s t s \color {#0F0} {tests} tests
│ ├── Makefile
│ ├── M a k e f i l e . a m \color {#0F0} {Makefile.am} Makefile.am
│ ├── Makefile.in
│ ├── t e s t d e n o i s e . v c p r o j \color {#0F0} {testdenoise.vcproj} testdenoise.vcproj
│ ├── t e s t e c h o . v c p r o j \color {#0F0} {testecho.vcproj} testecho.vcproj
│ └── t e s t r e s a m p l e . v c p r o j \color {#0F0} {testresample.vcproj} testresample.vcproj
└── V S 2008 \color {#0F0} {VS2008} VS2008
├── l i b s p e e x d s p \color {#0F0} {libspeexdsp} libspeexdsp
│ ├── l i b s p e e x d s p . v c p r o j \color {#0F0} {libspeexdsp.vcproj} libspeexdsp.vcproj
│ ├── Makefile
│ ├── M a k e f i l e . a m \color {#0F0} {Makefile.am} Makefile.am
│ └── Makefile.in
├── l i b s p e e x d s p . s l n \color {#0F0} {libspeexdsp.sln} libspeexdsp.sln
├── Makefile
├── M a k e f i l e . a m \color {#0F0} {Makefile.am} Makefile.am
├── Makefile.in
└── t e s t s \color {#0F0} {tests} tests
├── Makefile
├── M a k e f i l e . a m \color {#0F0} {Makefile.am} Makefile.am
├── Makefile.in
├── t e s t d e n o i s e . v c p r o j \color {#0F0} {testdenoise.vcproj} testdenoise.vcproj
├── t e s t e c h o . v c p r o j \color {#0F0} {testecho.vcproj} testecho.vcproj
└── t e s t r e s a m p l e . v c p r o j \color {#0F0} {testresample.vcproj} 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) @FFT_CFLAGS@
/*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:编译时的选项*/ @SPEEXDSP_LT_CURRENT@:@SPEEXDSP_LT_REVISION@:@SPEEXDSP_LT_AGE@
libspeexdsp_la_LIBADD = $(LIBM)

if BUILD_EXAMPLES /*编译测试文件*/ 
noinst_PROGRAMS = testdenoise testecho testjitter testresample testresample2
testdenoise_SOURCES = testdenoise.c
testdenoise_LDADD = libspeexdsp.la@FFT_LIBS@ /*链接需要libspeexdsp.la库文件*/
testecho_SOURCES = testecho.c /*需要的
testecho_LDADD = libspeexdsp.la @FFT_LIBS@ /*链接需要libspeexdsp.la库文件*/
testjitter_SOURCES = testjitter.c
testjitter_LDADD = libspeexdsp.la @FFT_LIBS@ /*链接需要libspeexdsp.la库文件*/
testresample_SOURCES = testresample.c
testresample_LDADD = libspeexdsp.la @FFT_LIBS@ @LIBM@ /*链接需要libspeexdsp.la库文件*/
testresample2_SOURCES = testresample2.c
testresample2_LDADD = libspeexdsp.la @FFT_LIBS@ @LIBM@ /*链接需要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这条语句
image.png

分析“make”过程log

以下是执行make命令后在终端显示的部分log,通过分析也可以知道编译so库需要的.c文件均位于libspeexdsp目录。

jiajiahao@ubuntu:~/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文件
image.png

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

image.png

从中也可以分析出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

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值