君正 mips 平台交叉编译 ncnn

前言

ncnn 是腾讯为手机端开发的一款极致优化高性能神经网络前向计算框架。ncnn 从设计之初深刻考虑手机端的部署和使用。无第三方依赖,跨平台,手机端 cpu 的速度快于目前所有已知的开源框架。

最近在君正芯片上进行的人脸识别项目时,需要用 ncnn 来加载人脸检测模型,遂进行君正平台的 ncnn 交叉编译,本文意在记录整个交叉编译过程,如有不足之处,欢迎指正。

一、开发环境

编译环境:Ubuntu16.04 ( x64 )
交叉编译链:mips-gcc520-64bit
OpenCV库:OpenCV ( 3.4.1 )
Protobuf: protobuf( 3.2.0 )
交叉编译工具:CMake ( 3.5.1 ),若未安装,请在终端执行:

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

二、编译 OpenCV

下载 OpenCV 源文件

终端执行:

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

2.1 安装依赖库

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

2.2 新建 build 编译目录和编译存储库目录 install

解压下载 OpenCV 源文件

unzip 3.4.1.zip
mv 3.4.1 opencv

新建文件夹

cd opencv
mkdir build
mkdir install

2.3 运行 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 点击 configure 按钮进入配置向导

编译的是 mips 平台 OpenCV 库,所以我们选择 Unix Makefiles,接着选择 Specify options for cross-compiling

2.3.3 配置交叉编译环境

点击 Next 进入交叉编译环境配置页面:

“Operating System”填写 mips-linux
“C Compilers” 填写交叉编译器(mips-linux-gnu-gcc)的路径
“C++ Compilers” 填写(mips-linux-gnu-g++)路径
“Target Root” 填写交叉编译器的 bin 目录,具体如下图:


修改 cmake-gui 配置

  • 修该配置默认安装目录 /usr/local,调整为新建的目录 install 所在路径(注意调整为自己新建 install 的路径),具体如下:
CMAKE_INSTALL_PREFIX       /home/yoko-zsb/opencv/install
  • 修改 “BUILD” 栏目下的编译选项 BUILD_JPEGBUILD_PNG ,具体如下:

  • 勾选 cmake-gui 工具顶部栏的 “Advanced”“Grouped” 选项

  • 修改 CMAKE 树找到以下这 4 个选项:

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

具体如:


配置完成后,依次点击 cmake-gui 工具左下方的 ConfigureGenerate 生成编译所需的 Makefile

2.3.4 执行编译,生成所需的编译库

在opencv/build 目录依次执行:

make -j8 
make install

执行 make -j8 结果图


执行 make install 结果图

2.4 查看编译结果

进入 opencv install/lib 所在目录(这里以我的 install 所在目录举例:/home/yoko-zsb/opencv/install/lib),查看编译生成的库

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

编译生成的库如下:

三、编译 Protobuf

3.1 下载 Protobuf 源文件

终端执行:

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

3.2 安装依赖库

sudo apt-get install curl libtool

3.3 新建 build 和 install 文件

新建 build 和 install 文件用来分别存储 PC 和 mips 版的 protoc 编译文件

cd protobuf
mkdir build 
mkdir install

3.4 生成 PC 版本 protoc 可执行文件

3.4.1 编译 PC 版本 Protoc

编译 PC 版本生成 protoc 可执行文件,供编译 mips 版本库时使用

  • 修改 /etc/bash.bashrc 设置为 CC/CXX/LD 为普通 gcc 编译器,在终端依次执行如下命令:
cd protobuf
./autogen.sh
./configure --prefix=/home/yoko-zsb/protobuf/build

注意 --prefix = “=号后面的路径替换成自己新建 build 路径”

执行过程截图:

  • 执行编译
make -j8
make install

编译结果

3.4.2 编译 mips 版 Protoc

终端执行:

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 分别用来设置编译 Protoc 的 PC 端和 mips-linux 系统类型

设置刚刚编译生成的 PC 端可以执行 protoc 文件路径
--with-protoc=/home/yoko-zsb/protobuf/build/bin/protoc

设置编译的输出路径
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++"

执行编译

make -j8
make install

生成 Protoc 的 lib 库
protobuf_lib.jpg

四、编译 ncnn

4.1 下载 ncnn 源文件

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

新建编译 build 目录和存储库目录 install

cd ncnn
mkdir build
mkdir install

4.2 配置 cmake-gui 编译工具参数

  • 配置 build 目录、编译库输出路径以及OpenCV库路径:

  • 配置完成后,鼠标单击 cmake-gui 编译工具左下角的 “Configure”

  • 设置 CMAKE 树选项
  • 修改其他设置选项

# 指定 protobuf 头文件和库文件路径(填写之前交叉编译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

然后依次执行 ConfigureGenerate 生成编译所需的 Makefile

执行编译

cd ncnn/build 
make -j8 
make install

4.4 查看编译结果

cd ncnn/install/lib

上图中生成 libncnn.a,即为编译生成 ncnn 静态库

五、错误修改

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

原因
设置 cmake-gui 工具参数没有添加 PNEG 和 JPG 图像格式支持

解决方案
更改 cmake-gui 工具参数配置参数,勾选 BUILD_JPEGBUILD_PNG,如下图

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

原因
由于 dlopen 被设计成 C-style,所以在使用g++编译器的时候,需要 CMAKE_EXE_LINKER_FLAGS 添加 -lpthread -lrt -ldl

解决方案
运行 cmake-gui, 增加上 -ldl 参数

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 库

解决方案
安装相应依赖库

sudo apt-get install libc6-dev build-essential gcc-multilib
  • 没有链接到 pthread 库
../../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

解决方案
运行 cmake-gui,增加 -lpthread -lrt 参数

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 选项,在 CMAKE 树找到以下这4个选项, 分别增加 -fPIC 即可。

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

公众号 striveallen 回复 ncnn,即可提取编译所需的交叉编译链以及编译生成的 OpenCVProtobuf 库、ncnn 静态库。

公众号准备了 200G+ 共享资源,包括 office 软件+学习视频,AutoCAD,PS CS6软件+视频,python、小程序、C语言、WEB、Javascript开发学习视频、机器学习等资源。只需关注公众号 Slater,回复关键字即可获取(失效请联系我)。

640.png

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,914评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,935评论 2 383
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,531评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,309评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,381评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,730评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,882评论 3 404
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,643评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,095评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,448评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,566评论 1 339
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,253评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,829评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,715评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,945评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,248评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,440评论 2 348