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

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

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

【潤和軟件DAYU200開發(fā)板體驗】移植speexdsp到OpenHarmony標(biāo)準(zhǔn)系統(tǒng)②

開發(fā)板試用精選 ? 來源:開發(fā)板試用 ? 作者:電子發(fā)燒友論壇 ? 2022-10-12 10:30 ? 次閱讀

本文來源電子發(fā)燒友社區(qū),作者:離北況歸, 帖子地址:https://bbs.elecfans.com/jishu_2308795_1_1.html



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


本期為移植speexdspOpenHarmony標(biāo)準(zhǔn)系統(tǒng)的第②期,主要內(nèi)容如下:

image.png


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

  • make和make install后會生成speexdsp的.so動態(tài)鏈接庫和.a靜態(tài)鏈接庫
make
make install

image.png

其中build/lib目錄下:

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

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

  • o: 編譯的目標(biāo)文件
  • a: 靜態(tài)庫,其實就是把若干o文件打了個包
  • so: 動態(tài)鏈接庫(共享庫) 動態(tài)庫文件必須以lib開頭,以.so結(jié)尾
  • lo: 使用libtool編譯出的目標(biāo)文件,其實就是在o文件中添加了一些信息
  • la: 使用libtool編譯出的庫文件,其實是個文本文件,記錄同名動態(tài)庫和靜態(tài)庫的相關(guān)信息

知識拓展

  • 函數(shù)庫分為靜態(tài)庫*a動態(tài)庫*.so兩種:
    ①靜態(tài)庫在程序編譯時會被連接到目標(biāo)代碼中,程序運行時將不再需要該靜態(tài)庫。
    ②動態(tài)庫在程序編譯時并不會被連接到目標(biāo)代碼中,而是在程序運行是才被載入,因此在程序運行時還需要動態(tài)庫存在。
  • 符號鏈接(symbolic link)是 Linux 系統(tǒng)中的一種文件,它指向系統(tǒng)中的另一個文件或目錄。符號鏈接類似于 Windows 系統(tǒng)中的快捷方式。
  • 在linux中,*.la是記錄同名動態(tài)庫和靜態(tài)庫相關(guān)信息的文本文件。

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

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

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

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

**├──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原生庫更新日志(和本次移植無關(guān)信息)
├──color {#0F0} {compile}
├──color {#0F0} {config.guess}#這個是在構(gòu)建環(huán)境上運行的一個腳本,它用來猜測構(gòu)建機的配置環(huán)境,因為這個腳本是在構(gòu)建機上運行,所以它可以動態(tài)執(zhí)行uname等命令來獲得構(gòu)建機的環(huán)境,所以我們一般不要指定這個變量,從而讓腳本自動獲得。
├── config.h#Config.h是自動生成的頭文件,是根據(jù)配置文件Config.h.in生成的。config.h主要用于代碼移植,產(chǎn)生可移植代碼。
├── config.h.in#autoheader后形成config.h.in
├── config.log#該文件在執(zhí)行configure文件時動態(tài)生成,包含了一些行號信息,表示一個文件在哪一行執(zhí)行,以及執(zhí)行的什么命令,因此可以知道測試是在哪個位置中完成。
├──color {#0F0} {config.status}#這是腳本文件,運行該腳本可以生成一個當(dāng)前相同的配置,從而避免再次執(zhí)行configure這個比較龐大的代碼。也就是config.log生成的是文本文件,而config.status生成的則是命令腳本文件。
├──color {#0F0} {config.sub}#這個是將host target build變量正則化的一個腳本,它的sub就是substitute的縮寫。因為用戶提供的build可能并不符合腳本正規(guī)的四元組或者三元組的結(jié)構(gòu),所以這個腳本將它轉(zhuǎn)換為標(biāo)準(zhǔn)的格式,從而可以進行格式化處理。
├──color {#0F0} {configure}#這個是我們需要監(jiān)測環(huán)境的主要入口文件,使用該文件可以生成Makefile文件,它會替換Makefile中需要替換的變量。
├──color {#0F0} {configure.ac}#該文件為autoconfigure文件使用的一個文件,該文件用來生成configure文件,這個文件一般是開發(fā)者維護,我們安裝該軟件的時候只需要執(zhí)行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}#測試聲學(xué)回音消除的文件
│ ├── 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是由ADIIntel公司聯(lián)合開發(fā)的微信號架構(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}**

分析原生庫下make.am文件

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

原生庫根目錄下的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 = 子目錄??芍猻peexdsp子目錄為libspeexdsp include doc win32 symbian ti 。再逐步查看各個文件夾源碼可知只有libspeexdsp include文件夾與本次移植有關(guān)。所以接下來查看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)的存在,因為FFTSRC=smallft.c)*/

/*noinst_HEADERS:這個表示該頭文件只是參加可執(zhí)行文件的編譯,而不用安裝到安裝目錄下
。如果需要安裝到系統(tǒng)中,可以用 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可執(zhí)行文件需要的.c源文件有testdenoise.c testec.c hotestjitter.c testresample.c testresample2.c

分析原生庫下Makefile文件

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

  • 顯式規(guī)則。顯式規(guī)則說明了如何生成一個或多個目標(biāo)文件。這是由Makefile的書寫者明顯指出要生成的文件、文件的依賴文件和生成的命令。
  • 隱晦規(guī)則。由于我們的make有自動推導(dǎo)的功能,所以隱晦的規(guī)則可以讓我們比較簡略地書寫 Makefile,這是由make所支持的。
  • 變量的定義。在Makefile中我們要定義一系列的變量,變量一般都是字符串,這個有點像你C語言中的宏,當(dāng)Makefile被執(zhí)行時,其中的變量都會被擴展到相應(yīng)的引用位置上。
  • 文件指示。其包括了三個部分,一個是在一個Makefile中引用另一個Makefile,就像C語言中的include一樣;另一個是指根據(jù)某些情況指定Makefile中的有效部分,就像C語言中的預(yù)編譯#if一樣;還有就是定義一個多行的命令。有關(guān)這一部分的內(nèi)容,我會在后續(xù)的部分中講述。
  • 注釋。Makefile中只有行注釋,和UNIX的Shell腳本一樣,其注釋是用 # 字符,這個就像C/C++中的 // 一樣。如果你要在你的Makefile中使用 # 字符,可以用反斜杠進行轉(zhuǎn)義,如: # 。

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

分析“make”過程log

以下是執(zhí)行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.1Making 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文件的所有參數(shù)
Name: 該模塊的名字,比如你的pc名字是xxxx.pc,那么名字最好也是xxxx。
Description: 模塊的簡單描述。上文pkg-config –list-all命令出來的結(jié)果,每個名字后面就是description。
URL: 用戶可以通過該URL獲得更多信息,或者下載信息。也是輔助的,可要可不要。
Version: 版本號。
Requires: 該模塊有木有依賴于其他模塊。一般沒有。
Requires.private: 該模塊有木有依賴于其他模塊,并且還不需要第三方知道的。一般也沒有。
Conflicts: 有沒有和別的模塊沖突。常用于版本沖突。比如,Conflicts: bar < 1.2.3,表示和bar模塊的1.2.3以下的版本有沖突。
Cflags: 這個就很重要了。pkg-config的參數(shù)–cflags就指向這里。主要用于寫本模塊的頭文件的路徑。
Libs: 也很重要,pkg-config的參數(shù)–libs就指向這里。主要用于寫本模塊的庫/依賴庫的路徑。
Libs.private: 本模塊依賴的庫,但不需要第三方知道。

在文件中的第14行中清楚的指出speexdsp依賴-lm這個庫。

分析運行configure命令后生成的config.log

image.png

從中也可以分析出speexdsp依賴的庫-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

結(jié)論

  • speexdsp依賴的庫為-lm
  • 編譯出speexdsp動態(tài)鏈接庫需要的.c源文件為preprocess.c jitter.c mdf.c fftwrap.c filterbank.c resample.c buffer.c scal.c、smallft.c。
  • 編譯出speexdsp動態(tài)鏈接庫需要的.h源文件目錄為libspeexdsp
  • 編譯出測試用的testdenoise testecho testjitter testresample testresample2可執(zhí)行文件需要的.c源文件有testdenoise.c testec.c hotestjitter.c testresample.c testresample2.c
  • 編譯出測試用的testdenoise testecho testjitter testresample testresample2可執(zhí)行文件需要的.h源文件目錄為根目錄下include
  • 編譯時需要添加的cflags編譯器標(biāo)志為-o-g-O2-fvisibility=hidden。

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

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

    關(guān)注

    1

    文章

    26

    瀏覽量

    1177
  • 潤和軟件
    +關(guān)注

    關(guān)注

    1

    文章

    243

    瀏覽量

    848
收藏 人收藏

    評論

    相關(guān)推薦

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

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

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

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

    開鴻“龍芯+OpenHarmony開發(fā)平臺DAYU431先鋒派新品發(fā)布

    開鴻基于全新龍芯2K0300芯片平臺的重磅新品開鴻HH-SCDAYU431先鋒派開發(fā)平臺正式上市,成為開鴻DAYU系列產(chǎn)品中符合
    的頭像 發(fā)表于 08-07 14:50 ?433次閱讀
    <b class='flag-5'>潤</b>開鴻“龍芯+<b class='flag-5'>OpenHarmony</b>”<b class='flag-5'>開發(fā)</b>平臺<b class='flag-5'>DAYU</b>431先鋒派新品發(fā)布

    鴻蒙OpenHarmony【基于Hi3516DV300開發(fā)板(時鐘應(yīng)用開發(fā))】

    如何快速搭建基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)(Hi3516DV300開發(fā)板)的應(yīng)用開發(fā)環(huán)境,并基于一個時鐘APP示例逐步展示應(yīng)用的創(chuàng)建、開發(fā)
    的頭像 發(fā)表于 05-08 15:27 ?1099次閱讀
    鴻蒙<b class='flag-5'>OpenHarmony</b>【基于Hi3516DV300<b class='flag-5'>開發(fā)板</b>(時鐘應(yīng)用<b class='flag-5'>開發(fā)</b>)】

    鴻蒙OpenHarmony南向:【Hi3516標(biāo)準(zhǔn)系統(tǒng)入門(命令行方式)】

    除小型系統(tǒng)外,Hi3516DV300開發(fā)板還支持標(biāo)準(zhǔn)系統(tǒng)。此章節(jié)簡要介紹如何使用命令行在Hi3516DV300開發(fā)板上進行標(biāo)準(zhǔn)系統(tǒng)
    的頭像 發(fā)表于 05-08 09:26 ?798次閱讀
    鴻蒙<b class='flag-5'>OpenHarmony</b>南向:【Hi3516<b class='flag-5'>標(biāo)準(zhǔn)系統(tǒng)</b>入門(命令行方式)】

    鴻蒙OpenHarmony標(biāo)準(zhǔn)系統(tǒng) 運行】(基于RK3568開發(fā)板

    燒錄完成重啟開發(fā)板后,系統(tǒng)將會自動啟動。開發(fā)板附帶的屏幕呈現(xiàn)以下界面,表明系統(tǒng)已運行成功。
    的頭像 發(fā)表于 05-06 15:38 ?428次閱讀
    鴻蒙<b class='flag-5'>OpenHarmony</b>【<b class='flag-5'>標(biāo)準(zhǔn)系統(tǒng)</b> 運行】(基于RK3568<b class='flag-5'>開發(fā)板</b>)

    OpenHarmony開發(fā)實例:【電話簿聯(lián)系人Contacts】

    Contacts應(yīng)用是基于OpenHarmony SDK開發(fā)的安裝在和HiSpark Taurus AI Camera(Hi3516d)開發(fā)板標(biāo)準(zhǔn)
    的頭像 發(fā)表于 04-23 09:44 ?694次閱讀
    <b class='flag-5'>OpenHarmony</b><b class='flag-5'>開發(fā)</b>實例:【電話簿聯(lián)系人Contacts】

    OpenHarmony開發(fā)實例:【 待辦事項TodoList】

    TodoList應(yīng)用是基于OpenHarmony SDK開發(fā)的安裝在和HiSpark Taurus AI Camera(Hi3516d)開發(fā)板標(biāo)準(zhǔn)
    的頭像 發(fā)表于 04-22 22:00 ?652次閱讀
    <b class='flag-5'>OpenHarmony</b><b class='flag-5'>開發(fā)</b>實例:【 待辦事項TodoList】

    【鴻蒙】OpenHarmony運行docker詳細步驟

    1.環(huán)境和設(shè)備 系統(tǒng)版本: 3.2release(64 位) OpenHarmony 內(nèi)核版本:5.10 標(biāo)準(zhǔn)系統(tǒng)設(shè)備: DAYU200 Docker:18.03.1 (64 位) s
    的頭像 發(fā)表于 03-02 15:10 ?2422次閱讀
    【鴻蒙】<b class='flag-5'>OpenHarmony</b>運行docker詳細步驟

    【鴻蒙】標(biāo)準(zhǔn)系統(tǒng)移植指南

    標(biāo)準(zhǔn)系統(tǒng)移植指南 本文描述了移植一塊開發(fā)板的通用步驟,和具體芯片相關(guān)的詳細移植過程無法在此一一列舉。后續(xù)社區(qū)還會陸續(xù)發(fā)布
    的頭像 發(fā)表于 02-27 14:36 ?802次閱讀
    【鴻蒙】<b class='flag-5'>標(biāo)準(zhǔn)系統(tǒng)</b><b class='flag-5'>移植</b>指南

    請問DAYU200有SPI可以用么

    大家好,請問DAYU200有SPI可以用么 我看這里https://developer.huawei.com/consumer/cn/market/prod-detail?productId
    發(fā)表于 02-20 11:38

    開鴻基于高性能RISC-V開源架構(gòu)DAYU800通過OpenHarmony兼容性測評

    近期,江蘇開鴻數(shù)字科技有限公司(以下簡稱“開鴻”)基于高性能RISC-V開源架構(gòu)處理器研發(fā)的OpenHarmony標(biāo)準(zhǔn)系統(tǒng)開發(fā)平臺HH-SCDAYU800通過
    的頭像 發(fā)表于 12-15 08:02 ?542次閱讀
    <b class='flag-5'>潤</b>開鴻基于高性能RISC-V開源架構(gòu)<b class='flag-5'>DAYU</b>800通過<b class='flag-5'>OpenHarmony</b>兼容性測評

    開鴻基于高性能RISC-V開源架構(gòu)DAYU800通過OpenHarmony兼容性測評

    近期,江蘇開鴻數(shù)字科技有限公司(以下簡稱“開鴻”)基于高性能RISC-V開源架構(gòu)處理器研發(fā)的OpenHarmony標(biāo)準(zhǔn)系統(tǒng)開發(fā)平臺HH-SCDAYU800通過
    發(fā)表于 12-14 17:33

    開鴻基于高性能RISC-V開源架構(gòu)DAYU800通過OpenHarmony兼容性測評

    的OpenAtom OpenHarmony(以下簡稱“OpenHarmony”)標(biāo)準(zhǔn)系統(tǒng)開發(fā)平臺HH-SCDAYU800通過OpenHarmony 3.2.2 Release版本兼容性
    的頭像 發(fā)表于 11-30 21:15 ?720次閱讀
    <b class='flag-5'>潤</b>開鴻基于高性能RISC-V開源架構(gòu)<b class='flag-5'>DAYU</b>800通過<b class='flag-5'>OpenHarmony</b>兼容性測評

    rk3568 dayu200開發(fā)版故障

    dayu200開發(fā)版卡在 DAYU開機界面,但是通過截屏軟件可以顯示正確圖像。
    發(fā)表于 11-30 09:53