最近在研究基于NPU的推理方法,编写的demo已经测试通过,但集成到项目中却发现各种问题。
一、编译错误
1 | /home/killf/data/AndroidSdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/bin/ld: warning: libz.so, needed by /home/sensing/face-api-deps/HIAI/HiAI_DDK_100.300.010.010/HiAI_DDK_100.200.010.011/DDK/ai_ddk_mixmodel_lib/lib64/libhiai.so, not found (try using -rpath or -rpath-link) |
期初以为这个错误是因为在不到libz.so
和libstdc++.so
引起的,事实上只需要加上-rpath-link
即可解决问题。
1 | target_link_options(test_performance PRIVATE -Wl,-rpath-link=/home/killf/data/AndroidSdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/26/) |
二、启动时段错误
一切都编译没问题,但启动的时候直接报Segmentation fault
,连main
函数中第一行代码都没有执行,所以这肯定是链接的问题,通过逐一排除的方法,发现问题出现在libhiai.so
上面。
三、链接protobuf的问题
1 | [libprotobuf ERROR /home/sensing/github/protobuf-3.6.1/src/google/protobuf/descriptor_database.cc:58] File already exists in database: google/protobuf/descriptor.proto[libprotobuf FATAL /home/sensing/github/protobuf-3.6.1/src/google/protobuf/descriptor.cc:1358] CHECK failed: GeneratedDatabase()->Add(encoded_file_descriptor, size): terminating with uncaught exception of type google::protobuf::FatalException: CHECK failed: GeneratedDatabase()->Add(encoded_file_descriptor, size): |
这是因为libhiai.so
中存在静态链接的protobuf
,而我们的项目也是静态链接了protobuf
,造成二次链接的问题。
- NPU不支持:DepthwiseConvolution