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编译。