ncnn 交叉编译Arm Linux,64位armv8架构

ncnn 交叉编译Arm Linux

对于海思的嵌入式板子,Tencent/ncnn 中提到了,安装 hislicon SDK,就会有它的交叉编译工具,本文是针对其他的arm核嵌入式板子的交叉编译,主要是 64位armv8架构的,例如 rk3399 64位。其他armv7 或者 32 位的可以也可以参考,下载不同的交叉编译工具,修改cmake就行。

1.环境

  • PC系统: ubuntu 16.04
  • 嵌入式板子: 例如rk3399 (系统 firefly_xubuntu16.04)
  • toolchain 工具: gcc-arm-8.2-2018.11-x86_64-aarch64-linux-gnu.tar.xz
  • 如果是其他架构,下载其他对应的 toolchain 工具

2.PC 端


下载上文中的交叉编译工具,配置环境变量

gedit ~/.bashrc

在文件中补充环境变量:

export PATH=$PATH:/home/alpha/gcc-arm-8.2-2018.11-x86_64-aarch64-linux-gnu/bin
source ~/.bashrc

下载 ncnn 并交叉编译

git clone https://github.com/Tencent/ncnn.git
cd ncnn
mkdir -p build-aarch64-linux
cd build-aarch64-linux
cmake -DCMAKE_TOOLCHAIN_FILE=../toolchains/aarch64-linux-gnu.toolchain.cmake ..
make -j8
make install

其中 ncnn/toolchains/aarch64-linux-gnu.toolchain.cmake 里面没有设置 -mfpu=neon,因为 armv8 架构中默认开启了 NEON;
此外,在编译前,可以把 CMakeLists.txt 中设置的 -fno-rtti -fno-exceptions 参数去掉.
-fno-rtti 禁用运行时类型信息
-fno-exceptions 禁用异常机制 参考
一般只有对程序运行效率及资源占用比较看重的场合才会使用, 如果要做这两个的话最好连libstdc++和其他所有的的c++库都用这两个参数重新编译一遍, 否则光是你自己的程序禁用了这两个特性, 而别的库依然开着, 效果就大打折扣了

交叉编译完成后,就得到了在 64位 armv8 架构下可用的 libncnn.a 库文件。

3.嵌入式端

将生成的 libncnn.a copy 到嵌入式板子的工程路径下,在 CMakeLists.txt 中添加如下,就可以编译自己的工程了。

target_link_libraries(shufflenet ${OpenCV_LIBS})
target_link_libraries(shufflenet ${PROJECT_SOURCE_DIR}/libncnn.a)

others

你可能感兴趣的:(深度学习)