NCNN在RK3288 Linux系统的原生编译问题解决

NCNN默认支持Android和iOS,使用Android NDK编译时会自动定义__ARM_NEON宏,从而获得较高的处理性能。在RK3288 Ubuntu Linux系统上编译时,默认是不开启__ARM_NEON宏的,虽然也能编译过,但是其性能却比Android系统低了一倍。

因此,要对NCNN做如下修改才能获得和Android一样的运行效果:

1、在顶层目录的CMakelist.txt文件中增加如下语句,强制打开宏__ARM_NEON

add_definitions(-D__ARM_NEON)
add_definitions("-mfloat-abi=hard -mfpu=neon")


2、按如下方式修改src/CMakeLists.txt:

if(TURE OR (ANDROID AND ("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "armv7-a"))

即强制进入ARM平台分支编译,否则会编译X86平台对应的C程序。


3、在RK3288的Linux系统上按照软件包:

sudo apt-get install gcc-multilib g++-multilib

如果不安装此包,则会报告错误:/usr/include/c++/5/string:38:28: fatal error: bits/c++config.h: No such file or directory


特别说明:

RK3288 Ubuntu系统默认的浮点数格式hard,所以上面要用参数-mfloat-abi=hard

但是对于安卓或者不支持hard模式的处理器,应该定义参数-mfloat-abi=softfp(NCNN的README.md文档中提到的3519处理器就是这样)

如果这两个参数不一致,那么虽然编译能通过,但是程序运行时就会报出找不到文件的错误,比如:./mtcnn: error while loading shared libraries: libopencv_highgui.so.2.4: cannot open shared object file: No such file or directory。我解决这个错误花了较长时间,它产生的原因就是:mtcnn程序使用“-mfloat-abi=softfp -mfpu=neon”编译,而安装的libopencv-dev软件包却默认采用-mfloat-abi=hard编译。


展开阅读全文

没有更多推荐了,返回首页