源文件未编译怎么解决_君正 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**。

bdaa65d953cdf574b1b2ffbf130d7907.png

2.3.3 配置交叉编译环境

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

“Operating System”填写 mips-linux

“C Compilers” 填写交叉编译器(mips-linux-gnu-gcc)的路径

“C++ Compilers” 填写(mips-linux-gnu-g++)路径 “

Target Root” 填写交叉编译器的 bin 目录,具体如下图:

6bce313e8a246dd2ac123d469552b16b.png

修改 cmake-gui 配置

修该配置默认安装目录 /usr/local,调整为新建的目录 install 所在路径(**注意调整为自己新建 install 的路径**),具体如下:

CMAKE_INSTALL_PREFIX       /home/yoko-zsb/opencv/install

1bd9d6b1a981bc0ae4b2ecccb8b049cd.png

修改 **“BUILD”** 栏目下的编译选项 **BUILD_JPEG** 和 **BUILD_PNG** ,具体如下:

f08e28233dead447b3c612de02b1a199.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

具体如:

447debe27bdc0bb4bedb2b64d5e428b9.png

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

228d6464f35cd4c6e0a63202a4b62850.png


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

在opencv/build 目录依次执行:

make -j8  
make install

执行 make -j8 结果图

b449cdf04059e425b54fe8554139c95e.png

执行 make install 结果图

62528b9c2bd928ac085dbec54723b5d9.png

2.4 查看编译结果

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

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

编译生成的库如下:

aee9fa28569e0729b85c3ef540062394.png

三、编译 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 路径”

138abe07d5778cb54ad3b477f2374469.png

执行过程截图:

b1984ee692b05cf0ce3d521b6b4f8c72.png

执行编译

make -j8
make install

编译结果

6568425074b952ec25a28a276bc787f4.png

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++"

8c1c3190328b506ff8200bc4ed8d871d.png

执行编译

make -j8
make install

生成 Protoc 的 lib 库

11b20235ee7085d0ba114c8645134fdf.png

四、编译 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库路径:

071e65e0abf31d967d68121ac75ba765.png

9ae36665f54e1d649525a6b826be9117.png

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

设置 CMAKE 树选项

28ca86e220913c140550ef0e833d489e.png

修改其他设置选项

指定 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

具体如下图:

7205d45473054e87a0e7d3c16932257a.png

4.3 生成编译所需Makefile

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

执行编译

cd ncnn/build  
make -j8  
make install

4.4 查看编译结果

cd ncnn/install/lib

893174b8a86ca397d90ef2c0fc7f2189.png

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

五、错误修改

[3rdparty/libpng/CMakeFiles/libpng.dir/pngrtran.c.obj] Error原因:
设置 cmake-gui 工具参数没有添加 PNEG 和 JPG 图像格式支持解决方案:
更改 cmake-gui 工具参数配置参数,勾选 **BUILD_JPEG** 和 **BUILD_PNG**,如下图

9cadc7d8e555993a96c5ded58ec56fb9.png

undefined reference to dlopen',undefined reference todlsym”

c72f2c9f7514ad490b95d2e3e4cc99d1.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

9ea808d8e0dfbc052f427fbe886d1dd9.png

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 topthread_create' 
../../lib/libopencv_core.so: undefined reference to dlopen' 
../../lib/libopencv_core.so: undefined reference topthread_mutex_trylock' 
../../lib/libopencv_core.so: undefined reference to clock_gettime' 
../../lib/libopencv_core.so: undefined reference todlsym' 
../../lib/libopencv_core.so: undefined reference to pthread_mutexattr_settype' 
../../lib/libopencv_core.so: undefined reference topthread_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 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值