君正 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
<think>我们面对的任务是:在MIPS架构上交叉编译live555库。 根据用户需求,我们需要交叉编译live555,而交叉编译需要交叉编译工具链。平台通常提供自己的交叉编译工具链。 步骤: 1. 获取交叉编译工具链:通常会提供针对其MIPS平台交叉编译工具链,我们需要下载并安装它。 2. 获取live555源码:从官网下载最新源码包。 3. 配置live555的编译配置,指定交叉编译工具链。 4. 编译并安装。 根据引用[1],交叉编译是在宿主机上生成目标机代码的过程。因此,我们需要在宿主机(比如x86的Ubuntu)上使用MIPS交叉编译工具链来编译live555。 具体步骤: 1. 准备交叉编译环境 根据引用[2]和引用[3],在Ubuntu上搭建交叉编译环境需要安装一些基础工具和库。但这里我们主要是针对live555的编译,而live555本身依赖较少,但需要确保交叉编译工具链已安装。 假设提供的交叉编译工具链已经安装,并且我们将其路径添加到环境变量中。例如,的工具链可能包含`mips-linux-gcc`等。 2. 下载live555源码 我们可以从官网下载:http://www.live555.com/liveMedia/public/ 3. 解压源码包 ```bash tar xvf live.XXXX.X.tar.gz cd live ``` 4. 配置交叉编译环境 在live555的源码目录中,有一个`config`目录,里面有针对不同平台的配置文件。我们可以基于其中一个创建自己的配置文件。 例如,创建一个`config.mips`文件,内容如下: ``` COMPILE_OPTS = $(INCLUDES) -I. -O2 -DSOCKLEN_T=socklen_t -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -DNO_OPENSSL=1 C = mips-linux-gcc C_COMPILER = $(C) C_FLAGS = $(COMPILE_OPTS) CPP = mips-linux-g++ CPP_COMPILER = $(CPP) CPP_FLAGS = $(COMPILE_OPTS) ``` 注意:这里假设交叉编译工具链的前缀是`mips-linux-`,请根据实际情况修改(比如的工具链可能是`mips-ingenic-linux-uclibc-gcc`等)。另外,如果目标平台需要其他特殊选项,也需要添加。 5. 生成Makefile 使用以下命令生成Makefile: ```bash ./genMakefiles config.mips ``` 6. 编译 ```bash make ``` 7. 安装(可选) 如果需要安装到指定目录,可以修改`config.mips`文件,添加安装路径,例如: ``` PREFIX = /path/to/install ``` 然后在生成Makefile之前设置好,或者编译后手动复制。 注意:live555默认不开启交叉编译,所以我们需要通过配置文件指定交叉编译器。 如果在编译过程中遇到问题,可能需要根据错误信息调整配置文件中的编译选项。 相关问题: 1. 如何确定MIPS平台交叉编译工具链? 2. live555在交叉编译过程中常见的问题有哪些? 3. 如何测试交叉编译后的live555库是否能在目标平台上运行?</think>### 在MIPS平台交叉编译live555的步骤 #### 1. **准备交叉编译工具链** 首先需要获取MIPS平台交叉编译工具链(通常由官方提供): ```bash # 下载MIPS工具链(示例路径,需替换为实际路径) wget https://ingenic.com/toolchain/mips-ingenic-linux-uclibc-gcc8.tar.gz tar -zxvf mips-ingenic-linux-uclibc-gcc8.tar.gz -C /opt/ ``` 配置环境变量: ```bash export PATH=/opt/mips-ingenic-linux-uclibc-gcc8/bin:$PATH export CC=mips-linux-gcc export CXX=mips-linux-g++ ``` #### 2. **安装依赖库** 根据引用[2],安装基础编译工具和库: ```bash sudo apt-get install autoconf automake build-essential libtool pkg-config ``` #### 3. **下载并配置live555** ```bash wget http://www.live555.com/liveMedia/public/live.2024.05.10.tar.gz tar -zxvf live.2024.05.10.tar.gz cd live ``` 生成针对MIPS的配置文件: ```bash ./genMakefiles linux-mips # 修改配置指向MIPS工具链 ``` 修改生成的`config.linux-mips`文件: ```makefile COMPILE_OPTS = -I. -O2 -DSOCKLEN_T=socklen_t -DLOCALE_NOT_USED -D_LARGEFILE_SOURCE=1 C_COMPILER = $(CC) # 使用环境变量中的mips-linux-gcc LINK = $(CXX) -o ``` #### 4. **编译与安装** ```bash make clean make -j$(nproc) ``` 将生成的可执行文件(如`live555MediaServer`)复制到目标设备: ```bash cp mediaServer/live555MediaServer /path/to/target/bin/ ``` #### 5. **验证(在目标设备运行)** ```bash ./live555MediaServer -p 8554 # 启动RTSP服务 ``` --- ### 常见问题解决 1. **链接错误** 若出现`undefined reference`,在`config.linux-mips`中添加静态链接选项: ```makefile LINK_OPTS += -static ``` 2. **头文件缺失** 确保工具链的`sysroot`路径确: ```bash export CFLAGS="--sysroot=/opt/mips-ingenic-linux-uclibc-gcc8/mips-linux-gnu/sysroot" ``` 3. **权限问题** 目标设备需赋予可执行权限: ```bash chmod +x /path/to/target/bin/live555MediaServer ``` --- ### 相关问题 1. 如何验证交叉编译后的live555在MIPS设备上的功能完整性? 2. 交叉编译live555时如何处理动态库依赖问题? 3. MIPS平台与其他MIPS架构的交叉编译有何差异? [^1]: 交叉编译是指在一个平台(宿主机)上生成另一个平台(目标机)能够执行的代码的过程。 [^2]: 安装基础编译依赖库的命令参考。 [^3]: 嵌入式平台开发环境搭建工具参考。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值