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)