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
终端执行:
wget https://github.com/opencv/opencv/archive/3.4.1.zip
sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg-dev libtiff4-dev libswscale-dev libjasper-dev
解压下载 OpenCV 源文件
unzip 3.4.1.zip
mv 3.4.1 opencv
新建文件夹
cd opencv
mkdir build
mkdir install
cd opencv/build
cmake-gui ..
Where is the source code 选择解压好的 opencv-3.4.1 根目录
where to build the binaries 选择新建的 build 目录
编译的是 mips 平台 OpenCV 库,所以我们选择 Unix Makefiles,接着选择 Specify options for cross-compiling。
点击 Next 进入交叉编译环境配置页面:
“Operating System”填写 mips-linux
“C Compilers” 填写交叉编译器(mips-linux-gnu-gcc)的路径
“C++ Compilers” 填写(mips-linux-gnu-g++)路径
“Target Root” 填写交叉编译器的 bin 目录,具体如下图:
修改 cmake-gui 配置
CMAKE_INSTALL_PREFIX /home/yoko-zsb/opencv/install
勾选 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 工具左下方的 Configure 和 Generate 生成编译所需的 Makefile
在opencv/build 目录依次执行:
make -j8
make install
执行 make -j8 结果图
进入 opencv install/lib 所在目录(这里以我的 install 所在目录举例:/home/yoko-zsb/opencv/install/lib),查看编译生成的库
cd /home/yoko-zsb/opencv/install/lib
ls
编译生成的库如下:
终端执行:
git clone https://github.com/protocolbuffers/protobuf.git
sudo apt-get install curl libtool
新建 build 和 install 文件用来分别存储 PC 和 mips 版的 protoc 编译文件
cd protobuf
mkdir build
mkdir install
编译 PC 版本生成 protoc 可执行文件,供编译 mips 版本库时使用
cd protobuf
./autogen.sh
./configure --prefix=/home/yoko-zsb/protobuf/build
注意 --prefix = “=号后面的路径替换成自己新建 build 路径”
执行过程截图:
make -j8
make install
编译结果
终端执行:
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
git clone https://github.com/Tencent/ncnn.git
新建编译 build 目录和存储库目录 install
cd ncnn
mkdir build
mkdir install
# 指定 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
具体如下图:
然后依次执行 Configure 和 Generate 生成编译所需的 Makefile
执行编译
cd ncnn/build
make -j8
make install
cd ncnn/install/lib
上图中生成 libncnn.a,即为编译生成 ncnn 静态库
原因
设置 cmake-gui 工具参数没有添加 PNEG 和 JPG 图像格式支持
解决方案:
更改 cmake-gui 工具参数配置参数,勾选 BUILD_JPEG 和 BUILD_PNG,如下图
原因
由于 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
原因
缺少 libc6-dev,build-essential,gcc-multilib 库
解决方案
安装相应依赖库
sudo apt-get install libc6-dev build-essential gcc-multilib
../../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
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,即可提取编译所需的交叉编译链以及编译生成的 OpenCV、Protobuf 库、ncnn 静态库。
公众号准备了 200G+ 共享资源,包括 office 软件+学习视频,AutoCAD,PS CS6软件+视频,python、小程序、C语言、WEB、Javascript开发学习视频、机器学习等资源。只需关注公众号 Slater,回复关键字即可获取(失效请联系我)。