嵌入式深度学习之NCNN交叉编译Arm Linux
2018-01-10 13:36
1516 查看
参考文档
NCNN在RK3288 Linux系统的原生编译问题解决本文档涉及到的目标硬件为英伟达JetsonTX1(4核Cortex-A53,Armv8.0架构),但是对其他Arm芯片也有一定的借鉴意义,只需要更换交叉编译链即可。
开发环境介绍
主机操作系统:Ubuntu14.04 64位目标平台:JetsonTX1 TegraX1
交叉工具链:aarch64-unknown-linux-gnu,gcc4.9.2
设置交叉编译链
# 在/etc/bash.bashrc的最后增加如下指令 # Tegra X1 cross compiler export ARCH=arm export PATH=/opt/toolchain/aarch64-unknown-linux-gnu/bin/:$PATH export CROSS_COMPILE=aarch64-unknown-linux-gnu- export CC=/opt/toolchain/aarch64-unknown-linux-gnu/bin/aarch64-unknown-linux-gnu-gcc export CXX=/opt/toolchain/aarch64-unknown-linux-gnu/bin/aarch64-unknown-linux-gnu-g++ export LD=/opt/toolchain/aarch64-unknown-linux-gnu/bin/aarch64-unknown-linux-gnu-ld export AR=/opt/toolchain/aarch64-unknown-linux-gnu/bin/aarch64-unknown-linux-gnu-ar export AS=/opt/toolchain/aarch64-unknown-linux-gnu/bin/aarch64-unknown-linux-gnu-as export RANLIB=/opt/toolchain/aarch64-unknown-linux-gnu/bin/aarch64-unknown-linux-gnu-ranlib # 修改完成之后需要重启命令行才能生效 # 你可以通过如下指令来确认交叉编译链是否已经设置好 echo $CC # 当显示/opt/toolchain/aarch64-unknown-linux-gnu/bin/aarch64-unknown-linux-gnu-gcc时表示交叉编译链已经设置好 # 当需要更换为本机编译时屏蔽上面的指令即可
下载依赖库
依赖库 | 版本 | 下载地址 |
---|---|---|
opencv | 3.2.0 | https://github.com/opencv/opencv |
protobuf | 3.2.0 | https://github.com/google/protobuf |
编译Opencv
新建cmake Build目录cd opencv-3.2.0 mkdir _install
使用cmake-gui进行配置
选择Specify options for cross-compiling,进入交叉编译链设置界面
# 设置交叉编译相关参数 # 本文使用的是NVIDIA提供的交叉工具链,存放位置为/opt/toolchain/aarch64-unknown-linux-gnu/(更改为你正在使用的目录) # 设置Operating System 为 arm-linux # 设置C编译器为 /opt/toolchain/aarch64-unknown-linux-gnu/bin/aarch64-unknown-linux-gnu-gcc(更改为你正在使用的gcc) # 设置C++编译器为 /opt/toolchain/aarch64-unknown-linux-gnu/bin/aarch64-unknown-linux-gnu-g++ # 设置System Root 为 /opt/toolchain/aarch64-unknown-linux-gnu/aarch64-unknown-linux-gnu/sysroot
点击Configure生成配置选项,并且打开Advancd选项
修改设置选项:
# 去掉勾选为FLASE 勾选为TRUE BUILD_SHARED_LIBS # FLASE为编译静态库 TRUE为编译动态库 CMAKE_BUILD_TYPE # Release CMAKE_CXX_FLAGS # -fPIC CMAKE_C_FLAGS # -fPIC CMAKE_EXE_LINKER_FLAGS # -lrt -lpthread CMAKE_INSTALL_PREFIX # 自定义安装目录 WITH_CUDA # FLASE 禁用CUDA WITH_CUFFT # FLASE 禁用CUFFT WITH_EIGEN # FLASE 禁用EIGEN WITH_FFMPEG # FLASE 禁用FFMPEG WITH_OPENCL # FLASE 禁用OPENCL WITH_OPENCLAMDBLAS # FLASE 禁用OPENCLAMDBLAS WITH_OPENCLAMDFFT # FLASE 禁用OPENCLAMDFFT WITH_OPENCL_SVM # FLASE 禁用OPENCL_SVM # 可选配置(根据需要进行配置) WITH_TIFF WITH_1394 WITH_GSTREAMER WITH_JASPER WITH_LAPACK WITH_MATLAB WITH_WEBP
点击Generate生成Makefile
进入_install目录&编译
cd _install make -j8 make install
编译Protobuf
安装软件sudo apt-get install curl libtool
生成PC版本protoc可执行文件,供编译ARM版本库时使用
# 修改/etc/bash.bashrc 设置为CC/CXX/LD为普通gcc编译器 cd protobuf-3.2.0 ./autoconf.sh ./configure --prefix=/usr/local/PC/protobuf-3.2.0
编译ARM版本
# 修改/etc/bash.bashrc 设置为CC/CXX/LD为交叉编译器 cd protobuf-3.2.0 ./autoconf.sh ./configure --build=i686-pc-linux --host=arm-linux \ --with-protoc=/usr/local/PC/protobuf-3.2.0/bin/protoc \ --prefix=/usr/local/TegraX1/protobuf-3.2.0 CFLAGS="-fPIC" CXXFLAGS="-fPIC -DNDEBUG"
编译&安装
make -j8 make install
编译NCNN
修改CmakeLists.txt此处的修改只适用于Armv7的设备,Armv8设备已经默认开启neon指令,所以不需要额外指定
添加行 add_definitions("-mfpu=neon")
修改src/CmakeLists.txt
if((ANDROID AND ("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "armv7-a")) 修改为 if(TURE OR (ANDROID AND ("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "armv7-a"))
这里会强制进入ARM平台编译,否则会编译成X86的版本在测试时会出现计算性能非常低的问题
新建cmake Build目录
cd ncnn-20171225 mkdir _install
打开cmake-gui进行交叉编译链配置,参考编译Opencv时的操作
点击Configure生成配置选项,并且打开Advancd选项
如果Cmake找不到Protobuf的位置会报错,暂时先不用管,后面修改设置后错误会消失
修改设置选项:
# 去掉勾选为FLASE 勾选为TRUE CMAKE_BUILD_TYPE # Release CMAKE_INSTALL_PREFIX # 自定义安装目录 # 指定protobuf头文件和库文件路径(填写之前交叉编译Protobuf的安装目录) PROTOBUF_INCLUDE_DIR /usr/local/TegraX1/protobuf-3.2.0/include PROTOBUF_LIBRARY /usr/local/TegraX1/protobuf-3.2.0/lib/libprotobuf.a PROTOBUF_LITE_LIBRARY /usr/local/TegraX1/protobuf-3.2.0/lib/libprotobuf-lite.so PROTOBUF_PROTOC_EXECUTABLE /usr/local/PC/protobuf-3.2.0/bin/protoc
点击Generate生成Makefile
进入_install目录&编译
cd _install make -j8 make install
相关文章推荐
- 嵌入式深度学习之mxnet交叉编译Arm Linux
- Linux嵌入式学习-Mplayer交叉编译-undefined reference to `clock_gettime' MPlayer
- 嵌入式平台arm linux 之qt 4.5交叉编译到webkit时出错解决方法
- 【ARM】嵌入式 ARM Linux 下移植 USB 蓝牙、交叉编译 bluez 各种版本
- 【Linux学习】Ubuntu下嵌入式交叉编译环境arm-linux-gcc搭建
- Linux嵌入式学习-交叉编译openssl
- Linux嵌入式学习-交叉编译mplayer
- 【Linux学习】Ubuntu下嵌入式交叉编译环境arm-linux-gcc搭建
- openssh 在arm linux 嵌入式平台交叉编译,100%成功运行
- 嵌入式学习——建立交叉编译环境 【1】
- 关于 c语言的编译 和编译后程序的运行 分类: 嵌入式开发学习 2011-03-29 19:57 909人阅读 评论(0) 收藏
- 创建ARM Linux交叉编译环境实践(转贴)
- 嵌入式学习 赋值 编译 连接地址问题
- 深度学习工具箱CAFFE在64位win7+VS2013环境下编译及运行
- appweb学习记录---交叉编译
- 深度学习---之softmax与交叉熵
- 如何为嵌入式开发建立交叉编译环境
- 神经网络与深度学习 笔记4 交叉熵代价函数 softmax函数
- OpenWrt学习记录三交叉编译helloworld
- Qt arm嵌入式交叉编译环境搭建