嵌入式深度学习之NCNN交叉编译Arm Linux

参考文档

  1. 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时表示交叉编译链已经设置好
# 当需要更换为本机编译时屏蔽上面的指令即可

下载依赖库

依赖库版本下载地址
opencv3.2.0https://github.com/opencv/opencv
protobuf3.2.0https://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(TRUE 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
  • 1
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!要在ARM Linux上进行ncnn交叉编译,您可以按照以下步骤进行操作: 1. 安装交叉编译工具链:首先,您需要安装适用于ARM Linux交叉编译工具链。这个工具链包含了ARM架构的编译器和库文件,可以在x86主机上生成ARM架构的可执行文件。您可以从ARM官方网站或者其他第三方提供商处获取适用于您的目标平台的交叉编译工具链。 2. 下载ncnn源代码:您可以从ncnn的GitHub仓库中获取源代码。您可以使用git命令进行克隆,或者直接下载压缩包并解压。 3. 配置交叉编译环境:在源代码目录中,打开CMakeLists.txt文件,找到相关的交叉编译选项。根据您的目标平台和交叉编译工具链的路径,设置正确的选项。一般来说,您需要设置CMAKE_SYSTEM_NAME为Linux,CMAKE_SYSTEM_PROCESSOR为arm,CMAKE_C_COMPILER和CMAKE_CXX_COMPILER为交叉编译工具链中对应的编译器。 4. 创建构建目录:在源代码目录外创建一个新的目录,用于构建过程。例如,您可以在源代码目录同级创建一个名为"build_arm"的目录。 5. 进入构建目录并运行cmake:使用cd命令进入构建目录,然后运行cmake命令来生成Makefile。 ``` cd build_arm cmake .. ``` 6. 执行make命令进行编译:运行make命令开始编译ncnn。 ``` make ``` 7. 编译完成后,您将在构建目录中找到生成的可执行文件和库文件,这些文件是针对ARM Linux平台的。 请注意,以上步骤只是一个大致的指导,具体的步骤可能因您使用的工具链和平台而有所差异。在实际操作中,您可能还需要根据具体情况进行一些调整和配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值