君正 mips 平臺(tái)交叉編譯 ncnn

前言

ncnn 是騰訊為手機(jī)端開發(fā)的一款極致優(yōu)化高性能神經(jīng)網(wǎng)絡(luò)前向計(jì)算框架瞒窒。ncnn 從設(shè)計(jì)之初深刻考慮手機(jī)端的部署和使用。無(wú)第三方依賴乡洼,跨平臺(tái)根竿,手機(jī)端 cpu 的速度快于目前所有已知的開源框架。

最近在君正芯片上進(jìn)行的人臉識(shí)別項(xiàng)目時(shí)就珠,需要用 ncnn 來(lái)加載人臉檢測(cè)模型寇壳,遂進(jìn)行君正平臺(tái)的 ncnn 交叉編譯,本文意在記錄整個(gè)交叉編譯過(guò)程妻怎,如有不足之處壳炎,歡迎指正。

一逼侦、開發(fā)環(huán)境

編譯環(huán)境:Ubuntu16.04 ( x64 )
交叉編譯鏈:mips-gcc520-64bit
OpenCV庫(kù):OpenCV ( 3.4.1 )
Protobuf: protobuf( 3.2.0 )
交叉編譯工具:CMake ( 3.5.1 )匿辩,若未安裝,請(qǐng)?jiān)诮K端執(zhí)行:

sudo apt-get install cmake
sudo apt-get install cmake-qt-gui

二榛丢、編譯 OpenCV

下載 OpenCV 源文件

終端執(zhí)行:

wget https://github.com/opencv/opencv/archive/3.4.1.zip

2.1 安裝依賴庫(kù)

sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg-dev libtiff4-dev libswscale-dev libjasper-dev

2.2 新建 build 編譯目錄和編譯存儲(chǔ)庫(kù)目錄 install

解壓下載 OpenCV 源文件

unzip 3.4.1.zip
mv 3.4.1 opencv

新建文件夾

cd opencv
mkdir build
mkdir install

2.3 運(yùn)行 cmake-gui 配置 OpenCV 生成 Makefile

cd opencv/build
cmake-gui ..

2.3.1 配置源碼路徑和輸出路徑

Where is the source code 選擇解壓好的 opencv-3.4.1 根目錄
where to build the binaries 選擇新建的 build 目錄

2.3.2 點(diǎn)擊 configure 按鈕進(jìn)入配置向?qū)?/h3>

編譯的是 mips 平臺(tái) OpenCV 庫(kù)铲球,所以我們選擇 Unix Makefiles,接著選擇 Specify options for cross-compiling晰赞。

2.3.3 配置交叉編譯環(huán)境

點(diǎn)擊 Next 進(jìn)入交叉編譯環(huán)境配置頁(yè)面:

“Operating System”填寫 mips-linux
“C Compilers” 填寫交叉編譯器(mips-linux-gnu-gcc)的路徑
“C++ Compilers” 填寫(mips-linux-gnu-g++)路徑
“Target Root” 填寫交叉編譯器的 bin 目錄稼病,具體如下圖:


修改 cmake-gui 配置

  • 修該配置默認(rèn)安裝目錄 /usr/local选侨,調(diào)整為新建的目錄 install 所在路徑(注意調(diào)整為自己新建 install 的路徑),具體如下:
CMAKE_INSTALL_PREFIX       /home/yoko-zsb/opencv/install
  • 修改 “BUILD” 欄目下的編譯選項(xiàng) BUILD_JPEGBUILD_PNG 然走,具體如下:

  • 勾選 cmake-gui 工具頂部欄的 “Advanced”“Grouped” 選項(xiàng)

  • 修改 CMAKE 樹找到以下這 4 個(gè)選項(xiàng):

CMAKE_CXX_FLAGS                     -fPIC 
CMAKE_CXX_FLAGS_DEBUG               -g -fPIC 

CMAKE_C_FLAGS                       -fPIC
CMAKE_C_FLAGS_DEBUG                 -g -fPIC

CMAKE_EXE_LINKER_FLAGS              -lpthread -lrt -ldl
CMAKE_EXE_LINKER_FLAGS_DEBUG        -lpthread -lrt -ldl

具體如:


配置完成后援制,依次點(diǎn)擊 cmake-gui 工具左下方的 ConfigureGenerate 生成編譯所需的 Makefile

2.3.4 執(zhí)行編譯,生成所需的編譯庫(kù)

在opencv/build 目錄依次執(zhí)行:

make -j8 
make install

執(zhí)行 make -j8 結(jié)果圖


執(zhí)行 make install 結(jié)果圖

2.4 查看編譯結(jié)果

進(jìn)入 opencv install/lib 所在目錄(這里以我的 install 所在目錄舉例:/home/yoko-zsb/opencv/install/lib)芍瑞,查看編譯生成的庫(kù)

cd /home/yoko-zsb/opencv/install/lib
ls

編譯生成的庫(kù)如下:

三晨仑、編譯 Protobuf

3.1 下載 Protobuf 源文件

終端執(zhí)行:

git clone https://github.com/protocolbuffers/protobuf.git

3.2 安裝依賴庫(kù)

sudo apt-get install curl libtool

3.3 新建 build 和 install 文件

新建 build 和 install 文件用來(lái)分別存儲(chǔ) PC 和 mips 版的 protoc 編譯文件

cd protobuf
mkdir build 
mkdir install

3.4 生成 PC 版本 protoc 可執(zhí)行文件

3.4.1 編譯 PC 版本 Protoc

編譯 PC 版本生成 protoc 可執(zhí)行文件,供編譯 mips 版本庫(kù)時(shí)使用

  • 修改 /etc/bash.bashrc 設(shè)置為 CC/CXX/LD 為普通 gcc 編譯器拆檬,在終端依次執(zhí)行如下命令:
cd protobuf
./autogen.sh
./configure --prefix=/home/yoko-zsb/protobuf/build

注意 --prefix = “=號(hào)后面的路徑替換成自己新建 build 路徑”

執(zhí)行過(guò)程截圖:

  • 執(zhí)行編譯
make -j8
make install

編譯結(jié)果

3.4.2 編譯 mips 版 Protoc

終端執(zhí)行:

make clean
./configure --build=mips-pc-linux --host=mips-linux    --with-protoc=/home/yoko-zsb/protobuf/build/bin/protoc  --prefix=/home/yoko-zsb/protobuf/install CFLAGS="-fPIC" CXXFLAGS="-fPIC -DNDEBUG" CC="/opt/ingenic_compiler/mips-gcc520/bin/mips-linux-gnu-gcc" CXX="/opt/ingenic_compiler/mips-gcc520/bin/mips-linux-gnu-g++"

其中:
--build=mips-pc-linux 和 --host=mips-linux 分別用來(lái)設(shè)置編譯 Protoc 的 PC 端和 mips-linux 系統(tǒng)類型

設(shè)置剛剛編譯生成的 PC 端可以執(zhí)行 protoc 文件路徑
--with-protoc=/home/yoko-zsb/protobuf/build/bin/protoc

設(shè)置編譯的輸出路徑
prefix=/home/yoko-zsb/protobuf/install

指定叉編譯器(mips-linux-gnu-gcc)的路徑
CC="/opt/ingenic_compiler/mips-gcc520/bin/mips-linux-gnu-gcc"

指定叉編譯器(mips-linux-gnu-g++)的路徑
CXX="/opt/ingenic_compiler/mips-gcc520/bin/mips-linux-gnu-g++"

執(zhí)行編譯

make -j8
make install

生成 Protoc 的 lib 庫(kù)
protobuf_lib.jpg

四洪己、編譯 ncnn

4.1 下載 ncnn 源文件

git clone https://github.com/Tencent/ncnn.git

新建編譯 build 目錄和存儲(chǔ)庫(kù)目錄 install

cd ncnn
mkdir build
mkdir install

4.2 配置 cmake-gui 編譯工具參數(shù)

  • 配置 build 目錄、編譯庫(kù)輸出路徑以及OpenCV庫(kù)路徑:

  • 配置完成后竟贯,鼠標(biāo)單擊 cmake-gui 編譯工具左下角的 “Configure”

  • 設(shè)置 CMAKE 樹選項(xiàng)
  • 修改其他設(shè)置選項(xiàng)

# 指定 protobuf 頭文件和庫(kù)文件路徑(填寫之前交叉編譯Protobuf 的安裝目錄)
PROTOBUF_INCLUDE_DIR     /home/yokozsb/protobuf/install/include
PROTOBUF_LIBRARY     /home/yokozsb/protobuf/install/lib/libprotobuf.a
PROTOBUF_LITE_LIBRARY  /home/yokozsb/protobuf/install/lib/libprotobuf-lite.a
PROTOBUF_PROTOC_EXECUTABLE    /home/yokozsb/protobuf/build/bin/protoc

具體如下圖:

4.3 生成編譯所需Makefile

然后依次執(zhí)行 ConfigureGenerate 生成編譯所需的 Makefile

執(zhí)行編譯

cd ncnn/build 
make -j8 
make install

4.4 查看編譯結(jié)果

cd ncnn/install/lib

上圖中生成 libncnn.a码泛,即為編譯生成 ncnn 靜態(tài)庫(kù)

五、錯(cuò)誤修改

  • [3rdparty/libpng/CMakeFiles/libpng.dir/pngrtran.c.obj] Error

原因
設(shè)置 cmake-gui 工具參數(shù)沒(méi)有添加 PNEG 和 JPG 圖像格式支持

解決方案
更改 cmake-gui 工具參數(shù)配置參數(shù)澄耍,勾選 BUILD_JPEGBUILD_PNG噪珊,如下圖

  • “undefined reference to dlopen',undefined reference todlsym’”

原因
由于 dlopen 被設(shè)計(jì)成 C-style齐莲,所以在使用g++編譯器的時(shí)候痢站,需要 CMAKE_EXE_LINKER_FLAGS 添加 -lpthread -lrt -ldl

解決方案
運(yùn)行 cmake-gui, 增加上 -ldl 參數(shù)

CMAKE_EXE_LINKER_FLAGS              -lpthread -lrt -ldl
CMAKE_EXE_LINKER_FLAGS_DEBUG        -lpthread -lrt -ldl
  • usr/include/stdlib.h:760:34: fatal error: bits/stdlib-bsearch.h: No such file or directory

原因
缺少 libc6-dev,build-essential,gcc-multilib 庫(kù)

解決方案
安裝相應(yīng)依賴庫(kù)

sudo apt-get install libc6-dev build-essential gcc-multilib
  • 沒(méi)有鏈接到 pthread 庫(kù)
../../lib/libopencv_core.so: undefined reference to `pthread_mutexattr_destroy'
../../lib/libopencv_core.so: undefined reference to `pthread_create'
../../lib/libopencv_core.so: undefined reference to `dlopen'
../../lib/libopencv_core.so: undefined reference to `pthread_mutex_trylock'
../../lib/libopencv_core.so: undefined reference to `clock_gettime'
../../lib/libopencv_core.so: undefined reference to `dlsym'
../../lib/libopencv_core.so: undefined reference to `pthread_mutexattr_settype'
../../lib/libopencv_core.so: undefined reference to `pthread_join'
../../lib/libopencv_core.so: undefined reference to `pthread_mutexattr_init'
collect2: error: ld returned 1 exit status
make[2]: *** [bin/opencv_test_core] Error 1
make[1]: *** [modules/core/CMakeFiles/opencv_test_core.dir/all] Error 2
make: *** [all] Error 2

解決方案
運(yùn)行 cmake-gui,增加 -lpthread -lrt 參數(shù)

CMAKE_EXE_LINKER_FLAGS              -lpthread -lrt
CMAKE_EXE_LINKER_FLAGS_DEBUG        -lpthread -lrt
  • “error adding symbols: Bad value”
root@dong-VirtualBox:~/opt/ingenic-linux-kernel3.10.14-x1000-v7.0-20170919/packages/example/App/opencv-3.0.0-build# make
[  2%] Built target zlib
[  7%] Built target libjpeg
[  9%] Built target libpng
[  9%] Built target opencv_hal_pch_dephelp
[  9%] Built target pch_Generate_opencv_hal
[ 10%] Built target opencv_hal
[ 10%] Built target opencv_core_pch_dephelp
[ 10%] Built target pch_Generate_opencv_core
Scanning dependencies of target opencv_core
[ 10%] Building CXX object modules/core/CMakeFiles/opencv_core.dir/src/system.cpp.obj
[ 10%] Linking CXX shared library ../../lib/libopencv_core.so
/root/opt/ingenic-linux-kernel3.10.14-x1000-v7.0-20170919/prebuilts/toolchains/mips-gcc520-glibc222/bin/../lib/gcc/mips-linux-gnu/5.2.0/../../../../mips-linux-gnu/bin/ld: ../../lib/libopencv_hal.a(matrix.cpp.obj): relocation R_MIPS_HI16 against `a local symbol' can not be used when making a shared object; recompile with -fPIC
../../lib/libopencv_hal.a: error adding symbols: Bad value
collect2: error: ld returned 1 exit status
make[2]: *** [lib/libopencv_core.so] Error 1
make[1]: *** [modules/core/CMakeFiles/opencv_core.dir/all] Error 2
make: *** [all] Error 2

解決方案
勾選 cmake-gui 工具的 Advanced 和 Grouped 選項(xiàng),在 CMAKE 樹找到以下這4個(gè)選項(xiàng), 分別增加 -fPIC 即可选酗。

CMAKE_CXX_FLAGS                     -fPIC 
CMAKE_CXX_FLAGS_DEBUG               -g -fPIC 
CMAKE_C_FLAGS                       -fPIC
CMAKE_C_FLAGS_DEBUG                 -g -fPIC

公眾號(hào) striveallen 回復(fù) ncnn阵难,即可提取編譯所需的交叉編譯鏈以及編譯生成的 OpenCVProtobuf 庫(kù)芒填、ncnn 靜態(tài)庫(kù)呜叫。

公眾號(hào)準(zhǔn)備了 200G+ 共享資源,包括 office 軟件+學(xué)習(xí)視頻殿衰,AutoCAD朱庆,PS CS6軟件+視頻,python闷祥、小程序娱颊、C語(yǔ)言、WEB凯砍、Javascript開發(fā)學(xué)習(xí)視頻箱硕、機(jī)器學(xué)習(xí)等資源。只需關(guān)注公眾號(hào) Slater悟衩,回復(fù)關(guān)鍵字即可獲染缯帧(失效請(qǐng)聯(lián)系我)。

640.png

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末座泳,一起剝皮案震驚了整個(gè)濱河市惠昔,隨后出現(xiàn)的幾起案子幕与,更是在濱河造成了極大的恐慌,老刑警劉巖舰罚,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異薛耻,居然都是意外死亡营罢,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門饼齿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)饲漾,“玉大人,你說(shuō)我怎么就攤上這事缕溉】即” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵证鸥,是天一觀的道長(zhǎng)僚楞。 經(jīng)常有香客問(wèn)我,道長(zhǎng)枉层,這世上最難降的妖魔是什么泉褐? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮鸟蜡,結(jié)果婚禮上膜赃,老公的妹妹穿的比我還像新娘。我一直安慰自己揉忘,他們只是感情好跳座,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著泣矛,像睡著了一般疲眷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上您朽,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天咪橙,我揣著相機(jī)與錄音,去河邊找鬼虚倒。 笑死美侦,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的魂奥。 我是一名探鬼主播菠剩,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼耻煤!你這毒婦竟也來(lái)了具壮?” 一聲冷哼從身側(cè)響起准颓,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎棺妓,沒(méi)想到半個(gè)月后攘已,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡怜跑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年样勃,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片性芬。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡峡眶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出植锉,到底是詐尸還是另有隱情辫樱,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布俊庇,位于F島的核電站狮暑,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏辉饱。R本人自食惡果不足惜心例,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鞋囊。 院中可真熱鬧止后,春花似錦、人聲如沸溜腐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)挺益。三九已至歉糜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間望众,已是汗流浹背匪补。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留烂翰,地道東北人夯缺。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像甘耿,于是被迫代替她去往敵國(guó)和親踊兜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354