君正 mips 平台交叉编译 ncnn

本文详细记录了在君正 MIPS 平台上使用 Ubuntu16.04 交叉编译 NCNN 的全过程,涉及 OpenCV、Protobuf 的编译。文章介绍了配置开发环境、安装依赖库、使用 CMake 配置编译选项,并解决了编译过程中遇到的错误,旨在帮助读者成功在 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 库在这里插入图片描述

四、编译 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

长按按识别

驱动器 D 中的卷是 LINUX 卷的序列号是 4471-561B D:\桌面\mips交叉编译环境 的目录 2009-10-22 20:27 <DIR> . 2009-10-22 20:27 <DIR> .. 2009-10-22 20:09 27,425,338 gcc-3.4.3.tar.bz2 2009-10-22 20:08 7,421,782 binutils-2.10.91.0.2.tar.bz2 2009-10-22 20:08 242,445 glibc-linuxthreads-2.5.tar.bz2 2009-10-22 20:10 20,544,628 glibc-2.5.tar.gz 2009-10-22 20:20 1,720 elf-machine-rela-mips.dpatch 2009-10-22 20:26 4,727 建立基于linux的MIPS交叉编译环境 .txt 6 个文件 55,640,640 字节 2 个目录 6,793,084,928 可用字节 三、构建过程 1、准备环境 目标平台: mipsel-linux(即little endian,x86也是little endian的,不懂的话自己到网上查资料吧) 安装目录: /usr/local/crossdev 源代码安装目录: /usr/local/src 注:没有的目录请自行建立。 2、准备MIPS环境的头文件 我们是在i386下编译的,但要使用MIPS的头文件定义才能编译MIPS交叉编译工具。这些头文件都在kernel源程序中。 cd /usr/local/src/ tar xzvf linux-2.4.2.tar.gz cd linux/ make ARCH=mips menuconfig 在"CPU selection"中, 选中"(R3000) CPU type",也可以选你实际的MIPS平台的CPU类型 在"General setup"中, 选中"Generate little endian code" make dep mkdir -p /usr/local/crossdev/mipsel-linux/include cp -r /usr/local/src/linux/include/asm-mips /usr/local/crossdev/mipsel-linux/include/asm cp -r /usr/local/src/linux/include/linux /usr/local/crossdev/mipsel-linux/include/ 3、编译binutils cd /usr/local/src/ tar xzvf binutils-2.11.90.0.31.tar.gz cd binutils-2.11.90.0.31/ ./configure --target=mipsel-linux --prefix=/usr/local/crossdev make make install export PATH=/usr/local/crossdev/bin:$PATH 4、编译自举的(bootstrap)gcc 因为这时还没有MIPS的glibc库可以使用,只能编译一个最简单的gcc,用这个gcc编译出glibc后就可以再编译一个完成的gcc了。 cd /usr/local/src/ tar xzvf gcc-3.0.2.tar.gz cd gcc-3.0.2/ ./configure --target=mipsel-linux --prefix=/usr/local/crossdev --enable-languages=c --with-newlib --disable-shared make make install 注:以上编译安装的工具已经可以直接编译MIPS的kernel(make zImage)了。 5、编译glibc 现在可以使用刚才建立的binutils和gcc来编译MIPS的glibc了。 cd /usr/local/src/ tar xzvf glibc-2.2.3.tar.gz cd glibc-2.2.3/ tar xzvf ../glibc-linuxthreads-2.2.3.tar.gz patch -p1 < ../glibc-2.2.3-mips-base-addr-got.diff CC=mipsel-linux-gcc AR=mipsel-linux-ar RANLIB=mipsel-linux-ranlib ./configure --host=mipsel-linux --prefix=/usr/local/crossdev/mipsel-linux --enable-add-ons=linuxthreads make make install 6、重新编译完整的gcc cd /usr/local/src/ rm -rf gcc-3.0.2/ tar xzvf gcc-3.0.2.tar.gz cd gcc-3.0.2/ ./configure --target=mipsel-linux --prefix=/usr/local/crossdev --enable-languages=c,c++ make make install 以上就构建好了一套自己的MIPS交叉编译环境,目录在/usr/local/crossdev下,你可以把它打包拷贝到其它i386的Linux系统下也能使用。 要使用其来交叉编译时请先加上PATH环境变量:export PATH=/usr/local/crossdev/bin:$PATH
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值