前言
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_JPEG 和 BUILD_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 工具左下方的 Configure 和 Generate 生成編譯所需的 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ù)四洪己、編譯 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í)行 Configure 和 Generate 生成編譯所需的 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_JPEG 和 BUILD_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阵难,即可提取編譯所需的交叉編譯鏈以及編譯生成的 OpenCV、Protobuf 庫(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)系我)。