在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

移植speexdsp到OpenHarmony標(biāo)準(zhǔn)系統(tǒng)②

電子發(fā)燒友開(kāi)源社區(qū) ? 來(lái)源:未知 ? 2022-11-30 09:10 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

由于想要分享的內(nèi)容較多,為避免讀者姥爺們失去看下去的耐心,分享將以連載的方式進(jìn)行。

第一期請(qǐng)點(diǎn)擊查看《移植speexdspOpenHarmony標(biāo)準(zhǔn)系統(tǒng)①》,本期為移植speexdsp到OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的第②期,主要內(nèi)容如下:

846e2556-704b-11ed-8abf-dac502259ad0.png

linux上生成speexdsp的so動(dòng)態(tài)鏈接庫(kù)和.a靜態(tài)鏈接庫(kù)

  • make和make install后會(huì)生成speexdsp的.so動(dòng)態(tài)鏈接庫(kù)和.a靜態(tài)鏈接庫(kù)

make
make install

(左右移動(dòng)查看全部?jī)?nèi)容)

84842a5e-704b-11ed-8abf-dac502259ad0.png

其中build/lib目錄下:

├── libspeexdsp.a               /*靜態(tài)庫(kù)*/
├── libspeexdsp.la               /*記錄同名動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)相關(guān)信息的la文本文件*/
├── libspeexdsp.so -> libspeexdsp.so.1.5.2 
├── libspeexdsp.so.1 -> libspeexdsp.so.1.5.2  /*符號(hào)鏈接*/
├── libspeexdsp.so.1.5.2            /*動(dòng)態(tài)庫(kù)*/
└── pkgconfig                 /*pkgconfig 的 *.pc文件*/
  └── speexdsp.pc

(左右移動(dòng)查看全部?jī)?nèi)容)

linux下的so、o、lo、a、la文件:

  • o: 編譯的目標(biāo)文件

  • a: 靜態(tài)庫(kù),其實(shí)就是把若干o文件打了個(gè)包

  • so: 動(dòng)態(tài)鏈接庫(kù)(共享庫(kù)) 動(dòng)態(tài)庫(kù)文件必須以lib開(kāi)頭,以.so結(jié)尾

  • lo: 使用libtool編譯出的目標(biāo)文件,其實(shí)就是在o文件中添加了一些信息

  • la: 使用libtool編譯出的庫(kù)文件,其實(shí)是個(gè)文本文件,記錄同名動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)的相關(guān)信息

知識(shí)拓展:

  • 函數(shù)庫(kù)分為靜態(tài)庫(kù)*a和動(dòng)態(tài)庫(kù)*.so兩種:
    ①靜態(tài)庫(kù)在程序編譯時(shí)會(huì)被連接到目標(biāo)代碼中,程序運(yùn)行時(shí)將不再需要該靜態(tài)庫(kù)。
    ②動(dòng)態(tài)庫(kù)在程序編譯時(shí)并不會(huì)被連接到目標(biāo)代碼中,而是在程序運(yùn)行是才被載入,因此在程序運(yùn)行時(shí)還需要?jiǎng)討B(tài)庫(kù)存在。

  • 符號(hào)鏈接(symbolic link)是 Linux 系統(tǒng)中的一種文件,它指向系統(tǒng)中的另一個(gè)文件或目錄。符號(hào)鏈接類似于 Windows 系統(tǒng)中的快捷方式。

  • 在linux中,*.la是記錄同名動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)相關(guān)信息的文本文件。

三、分析speexdsp在標(biāo)準(zhǔn)Linux系統(tǒng)的編譯過(guò)程文件

分析speexdsp在標(biāo)準(zhǔn)Linux系統(tǒng)的編譯過(guò)程文件,找到生成so庫(kù)和測(cè)試用的可執(zhí)行文件所需的.c源代碼,頭文件路徑,cflags編譯器標(biāo)志,所依賴的庫(kù)。

對(duì)比編譯前后的speexdsp原生庫(kù)結(jié)構(gòu)

  • tree工具能以樹(shù)形的方式顯示指定目錄的層級(jí)結(jié)構(gòu)。非綠色字體是編譯后生成的文件。

├── color {#0F0} {acinclude.m4}
├── color {#0F0} {AUTHORS} #speexdsp項(xiàng)目作者信息
├── color {#0F0} {autogen.sh} #autogen.sh腳本配置文件
├── aclocal.m4 #運(yùn)行aclocal后生成的aclocal.m4文件和一個(gè)緩沖文件夾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原生庫(kù)更新日志(和本次移植無(wú)關(guān)信息)
├── color {#0F0} {compile}
├── color {#0F0} {config.guess}#這個(gè)是在構(gòu)建環(huán)境上運(yùn)行的一個(gè)腳本,它用來(lái)猜測(cè)構(gòu)建機(jī)的配置環(huán)境,因?yàn)檫@個(gè)腳本是在構(gòu)建機(jī)上運(yùn)行,所以它可以動(dòng)態(tài)執(zhí)行uname等命令來(lái)獲得構(gòu)建機(jī)的環(huán)境,所以我們一般不要指定這個(gè)變量,從而讓腳本自動(dòng)獲得。
├── config.h#Config.h是自動(dòng)生成的頭文件,是根據(jù)配置文件Config.h.in生成的。config.h主要用于代碼移植,產(chǎn)生可移植代碼。
├── config.h.in#autoheader后形成config.h.in
├── config.log#該文件在執(zhí)行configure文件時(shí)動(dòng)態(tài)生成,包含了一些行號(hào)信息,表示一個(gè)文件在哪一行執(zhí)行,以及執(zhí)行的什么命令,因此可以知道測(cè)試是在哪個(gè)位置中完成。
├── color {#0F0} {config.status}#這是腳本文件,運(yùn)行該腳本可以生成一個(gè)當(dāng)前相同的配置,從而避免再次執(zhí)行configure這個(gè)比較龐大的代碼。也就是config.log生成的是文本文件,而config.status生成的則是命令腳本文件。
├── color {#0F0} {config.sub}#這個(gè)是將host target build變量正則化的一個(gè)腳本,它的sub就是substitute的縮寫(xiě)。因?yàn)橛脩籼峁┑腷uild可能并不符合腳本正規(guī)的四元組或者三元組的結(jié)構(gòu),所以這個(gè)腳本將它轉(zhuǎn)換為標(biāo)準(zhǔn)的格式,從而可以進(jìn)行格式化處理。
├── color {#0F0} {configure}#這個(gè)是我們需要監(jiān)測(cè)環(huán)境的主要入口文件,使用該文件可以生成Makefile文件,它會(huì)替換Makefile中需要替換的變量。
├── color {#0F0} {configure.ac}#該文件為autoconfigure文件使用的一個(gè)文件,該文件用來(lái)生成configure文件,這個(gè)文件一般是開(kāi)發(fā)者維護(hù),我們安裝該軟件的時(shí)候只需要執(zhí)行configure就可以,這個(gè)configure.ac我們一般不用理會(huì)
├── 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} #測(cè)試噪音抑制的文件
│ ├── testdenoise.o
│ ├── color {#0F0} {testecho}
│ ├── color {#0F0} {testecho.c} #測(cè)試聲學(xué)回音消除的文件
│ ├── testecho.o
│ ├── color {#0F0} {testjitter} # 測(cè)試抖動(dòng)的文件
│ ├── color {#0F0} {testjitter.c}
│ ├── testjitter.o
│ ├── color {#0F0} {testresample}
│ ├── color {#0F0} {testresample2}
│ ├── color {#0F0} {testresample2.c}#測(cè)試重采樣的文件
│ ├── testresample2.o
│ ├── color {#0F0} {testresample.c}#測(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是由ADIIntel公司聯(lián)合開(kāi)發(fā)的微信號(hào)架構(gòu)(MSA)
├── color {#0F0} {README.Trimedia}#Trimedia 是由Philips公司1996年推出的新一代媒體處理器(Media Processor)芯片。
├── color {#0F0} {README.win32}#Win32是指Microsoft Windows操作系統(tǒng)32位環(huán)境
├── 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}

(左右移動(dòng)查看全部?jī)?nèi)容)

分析原生庫(kù)下make.am文件

make.am是一種比Makefile文件抽象程序更高的編譯規(guī)則文件。 在里面可以指定生成目錄,編譯用的源碼,編譯的時(shí)候依賴哪些庫(kù),要安裝到什么目錄。

原生庫(kù)根目錄下的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

(左右移動(dòng)查看全部?jī)?nèi)容)

父目錄需要包含子目錄,在父目錄下的Makefile.am中需要添加: SUBDIRS = 子目錄。可知speexdsp子目錄為libspeexdsp include doc win32 symbian ti 。再逐步查看各個(gè)文件夾源碼可知只有l(wèi)ibspeexdsp include文件夾與本次移植有關(guān)。所以接下來(lái)查看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定義生成目標(biāo)文件的最上層目錄*/


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)的存在,因?yàn)镕FTSRC=smallft.c)*/


/*noinst_HEADERS:這個(gè)表示該頭文件只是參加可執(zhí)行文件的編譯,而不用安裝到安裝目錄下
。如果需要安裝到系統(tǒng)中,可以用 include_HEADERS來(lái)代替。*/
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:編譯時(shí)的選項(xiàng)*/ @SPEEXDSP_LT_CURRENT@:@SPEEXDSP_LT_REVISION@:@SPEEXDSP_LT_AGE@
libspeexdsp_la_LIBADD = $(LIBM)


if BUILD_EXAMPLES /*編譯測(cè)試文件*/ 
noinst_PROGRAMS = testdenoise testecho testjitter testresample testresample2
testdenoise_SOURCES = testdenoise.c
testdenoise_LDADD = libspeexdsp.la@FFT_LIBS@ /*鏈接需要libspeexdsp.la庫(kù)文件*/
testecho_SOURCES = testecho.c /*需要的
testecho_LDADD = libspeexdsp.la @FFT_LIBS@ /*鏈接需要libspeexdsp.la庫(kù)文件*/
testjitter_SOURCES = testjitter.c
testjitter_LDADD = libspeexdsp.la @FFT_LIBS@ /*鏈接需要libspeexdsp.la庫(kù)文件*/
testresample_SOURCES = testresample.c
testresample_LDADD = libspeexdsp.la @FFT_LIBS@ @LIBM@ /*鏈接需要libspeexdsp.la庫(kù)文件*/
testresample2_SOURCES = testresample2.c
testresample2_LDADD = libspeexdsp.la @FFT_LIBS@ @LIBM@ /*鏈接需要libspeexdsp.la庫(kù)文件*/
endif

(左右移動(dòng)查看全部?jī)?nèi)容)

通過(guò)分析libspeexdsp下的make.am可以知道:

  • 編譯出so庫(kù)需要的.c源文件有preprocess.c jitter.c mdf.c fftwrap.c filterbank.c resample.c
    buffer.c scal.c、smallft.c

  • 編譯出so庫(kù)需要的.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

  • 編譯出測(cè)試用的testdenoise testecho testjitter testresample testresample2可執(zhí)行文件需要的.c源文件有testdenoise.c testec.c hotestjitter.c testresample.c testresample2.c

分析原生庫(kù)下Makefile文件

Makefile里有什么?Makefile里主要包含了五個(gè)東西:顯式規(guī)則、隱晦規(guī)則、變量定義、文件指示和注釋。

  • 顯式規(guī)則。顯式規(guī)則說(shuō)明了如何生成一個(gè)或多個(gè)目標(biāo)文件。這是由Makefile的書(shū)寫(xiě)者明顯指出要生成的文件、文件的依賴文件和生成的命令。

  • 隱晦規(guī)則。由于我們的make有自動(dòng)推導(dǎo)的功能,所以隱晦的規(guī)則可以讓我們比較簡(jiǎn)略地書(shū)寫(xiě) Makefile,這是由make所支持的。

  • 變量的定義。在Makefile中我們要定義一系列的變量,變量一般都是字符串,這個(gè)有點(diǎn)像你C語(yǔ)言中的宏,當(dāng)Makefile被執(zhí)行時(shí),其中的變量都會(huì)被擴(kuò)展到相應(yīng)的引用位置上。

  • 文件指示。其包括了三個(gè)部分,一個(gè)是在一個(gè)Makefile中引用另一個(gè)Makefile,就像C語(yǔ)言中的include一樣;另一個(gè)是指根據(jù)某些情況指定Makefile中的有效部分,就像C語(yǔ)言中的預(yù)編譯#if一樣;還有就是定義一個(gè)多行的命令。有關(guān)這一部分的內(nèi)容,我會(huì)在后續(xù)的部分中講述。

  • 注釋。Makefile中只有行注釋,和UNIX的Shell腳本一樣,其注釋是用 # 字符,這個(gè)就像C/C++中的 // 一樣。如果你要在你的Makefile中使用 # 字符,可以用反斜杠進(jìn)行轉(zhuǎn)義,如: # 。

筆者在speexdsp根目錄下的makefile(最基本的Makefile)文件中搜索關(guān)鍵字CFLAGS找到CFLAGS = -g -O2 -fvisibility=hidden這條語(yǔ)句

84957796-704b-11ed-8abf-dac502259ad0.png

分析“make”過(guò)程log

以下是執(zhí)行make命令后在終端顯示的部分log,通過(guò)分析也可以知道編譯so庫(kù)需要的.c文件均位于libspeexdsp目錄。

jiajiahao@ubuntu:~/Desktop/speexdsp-SpeexDSP-1.2.1$ make
make all-recursive
make[1]: 進(jìn)入目錄“/home/jiajiahao/Desktop/speexdsp-SpeexDSP-1.2.1
Making all in libspeexdsp
make[2]: 進(jìn)入目錄“/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]: 離開(kāi)目錄“/home/jiajiahao/Desktop/speexdsp-SpeexDSP-1.2.1/libspeexdsp”

(左右移動(dòng)查看全部?jī)?nèi)容)

分析build安裝目錄下生成的.pc文件

下圖為build/lib/pkgconfig目錄的speexdsp.pc文件

84a4a9c8-704b-11ed-8abf-dac502259ad0.png

.pc文件的所有參數(shù):

  • Name: 該模塊的名字,比如你的pc名字是xxxx.pc,那么名字最好也是xxxx。

  • Description: 模塊的簡(jiǎn)單描述。上文pkg-config –list-all命令出來(lái)的結(jié)果,每個(gè)名字后面就是description。

  • URL: 用戶可以通過(guò)該URL獲得更多信息,或者下載信息。也是輔助的,可要可不要。

  • Version: 版本號(hào)。

  • Requires: 該模塊有木有依賴于其他模塊。一般沒(méi)有。

  • Requires.private: 該模塊有木有依賴于其他模塊,并且還不需要第三方知道的。一般也沒(méi)有。

  • Conflicts: 有沒(méi)有和別的模塊沖突。常用于版本沖突。比如,Conflicts: bar < 1.2.3,表示和bar模塊的1.2.3以下的版本有沖突。

  • Cflags: 這個(gè)就很重要了。pkg-config的參數(shù)–cflags就指向這里。主要用于寫(xiě)本模塊的頭文件的路徑。

  • Libs: 也很重要,pkg-config的參數(shù)–libs就指向這里。主要用于寫(xiě)本模塊的庫(kù)/依賴庫(kù)的路徑。

  • Libs.private: 本模塊依賴的庫(kù),但不需要第三方知道。

在文件中的第14行中清楚的指出speexdsp依賴-lm這個(gè)庫(kù)。

分析運(yùn)行configure命令后生成的config.log

84c24244-704b-11ed-8abf-dac502259ad0.png

從中也可以分析出speexdsp依賴的庫(kù)-lm 和編譯器需要添加的C_FLAGS標(biāo)記-g -O2 -fvisibility=hidden

configure:9932: checking for cos in -lm
configure:9957: gcc -o conftest -g -O2 -fvisibility=hidden  conftest.c -lm  >&5

(左右移動(dòng)查看全部?jī)?nèi)容)

結(jié)論

  • speexdsp依賴的庫(kù)為-lm

  • 編譯出speexdsp動(dòng)態(tài)鏈接庫(kù)需要的.c源文件為preprocess.c jitter.c mdf.c fftwrap.c filterbank.c resample.c buffer.c scal.c、smallft.c。

  • 編譯出speexdsp動(dòng)態(tài)鏈接庫(kù)需要的.h源文件目錄為libspeexdsp

  • 編譯出測(cè)試用的testdenoise testecho testjitter testresample testresample2可執(zhí)行文件需要的.c源文件有testdenoise.c testec.c hotestjitter.c testresample.c testresample2.c

  • 編譯出測(cè)試用的testdenoise testecho testjitter testresample testresample2可執(zhí)行文件需要的.h源文件目錄為根目錄下include

  • 編譯時(shí)需要添加的cflags編譯器標(biāo)志為-o -g -O2 -fvisibility=hidden

下期分享內(nèi)容:將三方庫(kù)加入到OpenHarmony的編譯體系

更多熱點(diǎn)文章閱讀

  • 基于OpenHarmony的智慧牧場(chǎng)方案:室內(nèi)管理系統(tǒng)篇
  • 移植speexdsp到OpenHarmony標(biāo)準(zhǔn)系統(tǒng)①
  • OpenHarmony 3.2 Beta多媒體系列:音視頻播放gstreamer
  • 基于OpenHarmony的智慧牧場(chǎng)方案:生物運(yùn)動(dòng)軌跡跟蹤篇
  • 基于OpenHarmony的智能門(mén)禁系統(tǒng),讓出行更便捷

提示:本文由電子發(fā)燒友社區(qū)發(fā)布,轉(zhuǎn)載請(qǐng)注明以上來(lái)源。如需社區(qū)合作及入群交流,請(qǐng)?zhí)砑游⑿臙EFans0806,或者發(fā)郵箱liuyong@huaqiu.com。


原文標(biāo)題:移植speexdsp到OpenHarmony標(biāo)準(zhǔn)系統(tǒng)②

文章出處:【微信公眾號(hào):電子發(fā)燒友開(kāi)源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴

原文標(biāo)題:移植speexdsp到OpenHarmony標(biāo)準(zhǔn)系統(tǒng)②

文章出處:【微信號(hào):HarmonyOS_Community,微信公眾號(hào):電子發(fā)燒友開(kāi)源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的C++公共基礎(chǔ)類庫(kù)案例:ThreadPoll

    1、程序簡(jiǎn)介該程序是基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的C++公共基礎(chǔ)類庫(kù)的線程池處理:ThreadPoll。本案例完成如下工作:創(chuàng)建1個(gè)線程池,設(shè)置該線程池內(nèi)部有1024個(gè)線程空間。啟動(dòng)5個(gè)線程
    的頭像 發(fā)表于 02-10 18:09 ?353次閱讀
    基于<b class='flag-5'>OpenHarmony</b><b class='flag-5'>標(biāo)準(zhǔn)系統(tǒng)</b>的C++公共基礎(chǔ)類庫(kù)案例:ThreadPoll

    基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的C++公共基礎(chǔ)類庫(kù)案例:Semaphore

    1、程序簡(jiǎn)介該程序是基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的C++公共基礎(chǔ)類庫(kù)的線程處理:Sempahore。本案例完成如下工作:(1)無(wú)名信號(hào)量使用方法定義1個(gè)無(wú)名信號(hào)量,1個(gè)供無(wú)名信號(hào)量管理
    的頭像 發(fā)表于 02-10 18:08 ?325次閱讀
    基于<b class='flag-5'>OpenHarmony</b><b class='flag-5'>標(biāo)準(zhǔn)系統(tǒng)</b>的C++公共基礎(chǔ)類庫(kù)案例:Semaphore

    基于ArkTS語(yǔ)言的OpenHarmony APP應(yīng)用開(kāi)發(fā):HelloOpenharmony

    1、程序簡(jiǎn)介該程序是基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)編寫(xiě)的UI應(yīng)用類:HelloOpenHarmony。本案例是基于API9接口開(kāi)發(fā)。本案例已在OpenHarmony凌蒙派-RK35
    的頭像 發(fā)表于 09-15 08:09 ?854次閱讀
    基于ArkTS語(yǔ)言的<b class='flag-5'>OpenHarmony</b> APP應(yīng)用開(kāi)發(fā):Hello<b class='flag-5'>Openharmony</b>

    瑞芯微RK3566鴻蒙開(kāi)發(fā)板OpenHarmony標(biāo)準(zhǔn)系統(tǒng)應(yīng)用兼容性測(cè)試指導(dǎo)

    本文OpenHarmony標(biāo)準(zhǔn)系統(tǒng)應(yīng)用兼容性測(cè)試指導(dǎo),適用鴻蒙系統(tǒng)軟件開(kāi)發(fā)測(cè)試的新手入門(mén)學(xué)習(xí)課程,設(shè)備為觸覺(jué)智能的瑞芯微RK3566開(kāi)發(fā)板,型號(hào)Purple Pi OH。是Laval官方社區(qū)主薦的一款鴻蒙開(kāi)發(fā)主板。
    的頭像 發(fā)表于 09-10 11:56 ?1250次閱讀
    瑞芯微RK3566鴻蒙開(kāi)發(fā)板<b class='flag-5'>OpenHarmony</b><b class='flag-5'>標(biāo)準(zhǔn)系統(tǒng)</b>應(yīng)用兼容性測(cè)試指導(dǎo)

    基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的C++公共基礎(chǔ)類庫(kù)案例:rwlock

    1、程序簡(jiǎn)介該程序是基于OpenHarmony的C++公共基礎(chǔ)類庫(kù)的讀寫(xiě)鎖:rwlock。本案例主要完成如下工作:創(chuàng)建3個(gè)讀線程,每個(gè)讀線程循環(huán)5次,每次循環(huán)獲取讀鎖,將公共資源變量打印,睡眠1秒
    的頭像 發(fā)表于 08-30 12:42 ?643次閱讀
    基于<b class='flag-5'>OpenHarmony</b><b class='flag-5'>標(biāo)準(zhǔn)系統(tǒng)</b>的C++公共基礎(chǔ)類庫(kù)案例:rwlock

    基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的C++公共基礎(chǔ)類庫(kù)案例:SafeMap

    1、程序簡(jiǎn)介該程序是基于OpenHarmony的C++公共基礎(chǔ)類庫(kù)的安全關(guān)聯(lián)容器:SafeMap。OpenHarmony提供了一個(gè)線程安全的map實(shí)現(xiàn)。SafeMap在STLmap基礎(chǔ)上封裝互斥鎖
    的頭像 發(fā)表于 08-30 12:42 ?758次閱讀
    基于<b class='flag-5'>OpenHarmony</b><b class='flag-5'>標(biāo)準(zhǔn)系統(tǒng)</b>的C++公共基礎(chǔ)類庫(kù)案例:SafeMap

    基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的C++公共基礎(chǔ)類庫(kù)案例:SafeQueue

    1、程序簡(jiǎn)介該程序是基于OpenHarmony的C++公共基礎(chǔ)類庫(kù)的線程安全隊(duì)列:SafeQueue。線程安全隊(duì)列,是在dequeue的基礎(chǔ)上封裝std::lock_guard,以此實(shí)現(xiàn)線程的相關(guān)
    的頭像 發(fā)表于 08-30 12:41 ?668次閱讀
    基于<b class='flag-5'>OpenHarmony</b><b class='flag-5'>標(biāo)準(zhǔn)系統(tǒng)</b>的C++公共基礎(chǔ)類庫(kù)案例:SafeQueue

    基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的C++公共基礎(chǔ)類庫(kù)案例:SafeStack

    1、程序簡(jiǎn)介該程序是基于OpenHarmony的C++公共基礎(chǔ)類庫(kù)的線程安全隊(duì)列:SafeQueue。線程安全隊(duì)列,是在dequeue的基礎(chǔ)上封裝std::lock_guard,以此實(shí)現(xiàn)線程的相關(guān)
    的頭像 發(fā)表于 08-30 12:41 ?680次閱讀
    基于<b class='flag-5'>OpenHarmony</b><b class='flag-5'>標(biāo)準(zhǔn)系統(tǒng)</b>的C++公共基礎(chǔ)類庫(kù)案例:SafeStack

    基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的C++公共基礎(chǔ)類庫(kù)案例:SafeBlockQueue

    1、程序簡(jiǎn)介該程序是基于OpenHarmony的C++公共基礎(chǔ)類庫(kù)的讀寫(xiě)鎖:SafeBlockQueue。線程安全阻塞隊(duì)列SafeBlockQueue類,提供阻塞和非阻塞版的入隊(duì)入隊(duì)和出隊(duì)接口,并提
    的頭像 發(fā)表于 08-30 12:41 ?573次閱讀
    基于<b class='flag-5'>OpenHarmony</b><b class='flag-5'>標(biāo)準(zhǔn)系統(tǒng)</b>的C++公共基礎(chǔ)類庫(kù)案例:SafeBlockQueue

    基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的C++公共基礎(chǔ)類庫(kù)案例:SafeStack

    /a28_utils_safestack 2、基礎(chǔ)知識(shí) C++公共基礎(chǔ)類庫(kù)為標(biāo)準(zhǔn)系統(tǒng)提供了一些常用的C++開(kāi)發(fā)工具類,包括: 文件、路徑、字符串相關(guān)操作的能力增強(qiáng)接口 讀寫(xiě)鎖、信號(hào)量、定時(shí)器、線程增強(qiáng)及線程池等接口
    發(fā)表于 08-21 14:51

    基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的C++公共基礎(chǔ)類庫(kù)案例:SafeQueue

    /a27_utils_safequeue 2、基礎(chǔ)知識(shí) C++公共基礎(chǔ)類庫(kù)為標(biāo)準(zhǔn)系統(tǒng)提供了一些常用的C++開(kāi)發(fā)工具類,包括: 文件、路徑、字符串相關(guān)操作的能力增強(qiáng)接口 讀寫(xiě)鎖、信號(hào)量、定時(shí)器、線程增強(qiáng)及線程池等
    發(fā)表于 08-21 10:56

    基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的C++公共基礎(chǔ)類庫(kù)案例:rwlock

    /samples/a25_utils_rwlock 2、基礎(chǔ)知識(shí) C++公共基礎(chǔ)類庫(kù)為標(biāo)準(zhǔn)系統(tǒng)提供了一些常用的C++開(kāi)發(fā)工具類,包括: 文件、路徑、字符串相關(guān)操作的能力增強(qiáng)接口 讀寫(xiě)鎖、信號(hào)量、定時(shí)器、線程
    發(fā)表于 08-20 09:37

    請(qǐng)求推薦無(wú)需NPU的OpenHarmony標(biāo)準(zhǔn)系統(tǒng)ARM開(kāi)發(fā)板

    請(qǐng)教一下大佬們,目前的需求是在國(guó)產(chǎn)ARM開(kāi)發(fā)板上跑OpenHarmony標(biāo)準(zhǔn)系統(tǒng),無(wú)需NPU/GPU,其它配置(CPU、RAM等)可以盡量高點(diǎn),價(jià)位在2k以內(nèi),球球推薦!感謝大佬們!
    發(fā)表于 08-16 16:25

    OpenHarmony標(biāo)準(zhǔn)系統(tǒng)C++公共基礎(chǔ)類庫(kù)案例:HelloWorld

    1、程序簡(jiǎn)介該程序是基于凌蒙派OpenHarmony-v3.2.1標(biāo)準(zhǔn)系統(tǒng)C++公共基礎(chǔ)類庫(kù)的簡(jiǎn)單案例:HelloWorld。主要講解C++公共基礎(chǔ)類庫(kù)案例如何搭建和編譯。2、程序解析2.1、創(chuàng)建
    的頭像 發(fā)表于 08-13 08:23 ?840次閱讀
    <b class='flag-5'>OpenHarmony</b><b class='flag-5'>標(biāo)準(zhǔn)系統(tǒng)</b>C++公共基礎(chǔ)類庫(kù)案例:HelloWorld

    基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的C++公共基礎(chǔ)類庫(kù)案例:ThreadPoll

    1、程序簡(jiǎn)介 該程序是基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的C++公共基礎(chǔ)類庫(kù)的線程池處理:ThreadPoll。 本案例完成如下工作: 創(chuàng)建1個(gè)線程池,設(shè)置該線程池內(nèi)部有1024個(gè)線程空間。 啟動(dòng)5
    發(fā)表于 08-12 11:42
    主站蜘蛛池模板: 1024免费永久福利视频 | 亚洲色图综合网站 | 国产在线色视频 | 手机看片自拍 | 51影院在线观看成人免费 | 色香焦 | 毛片毛片毛片毛片毛片毛片 | 性做久久久久久久久 | 亚洲精品影视 | 国产卡1卡2卡三卡网站免费 | 欧美黄页 | 综合色婷婷 | 亚洲成人国产 | 黄 色 成 年人网站 黄 色 成 年人在线 | 欧美特黄一免在线观看 | 亚洲国产丝袜精品一区杨幂 | 四虎永久地址4hu紧急入口 | 亚洲国产精品自在现线让你爽 | 一级欧美一级日韩 | 国产在线精品观看 | semm亚洲欧美在线高清 | 精品三级网站 | 久草视频这里只有精品 | 成人午夜在线观看国产 | 欧美日韩国产网站 | 免费视频网站在线看视频 | 色婷婷六月 | 欧美色图日韩色图 | 黄色免费网站在线观看 | 欧美xxxxxbbbb | 亚洲婷婷在线视频 | 美女被猛男躁免费视频网站 | 日本3级视频 | 一级毛片在线 | 色综合久久中文字幕网 | 色中色综合 | 99久热只有精品视频免费观看17 | 日本三级香港三级人妇99视 | 免费人成网址在线观看国内 | 久久久久毛片成人精品 | 亚洲青草视频 |