在Android平台使用SNPE应链接libc++库
2020-03-17 16:01:12来源:博客园 阅读 ()
在Android平台使用SNPE库以前都什么太大问题,最近因为要使用userBuffer,编译时报链接错误:
undefined reference to `zdl::DlSystem::TensorShape::TensorShape(std::vector<unsigned long, std::allocator<unsigned long> >)
因为是链接错误,而且查看了头文件,TensorShape有对应的重载构造函数,所以怀疑SNPE的库文件libSNPE.so不对。怀疑高通提供的库文件不对,好像这也不太可能,一时间陷入了困境。
开始从高通的客服那边没有得到太有用的信息,只能自己想办法。用objdump从库文件dump出符号表看看有没有对应的函数。但是高通release库肯定是把符号表去掉了的,只能通过objdump -T出来动态符号。从动态符号中筛选出和TensorShape相关的,然后找一些看着可能像的符号,用c++filt还原出函数名。
先在x86_64平台的libSNPE.so找到了
c++filt _ZN3zdl8DlSystem11TensorShapeC1ESt6vectorImSaImEE
zdl::DlSystem::TensorShape::TensorShape(std::vector<unsigned long, std::allocator<unsigned long> >)
这和我们需要的函数是一样的,也就是说x86_64平台的libSNPE.so肯定是包含这个重载的函数实现的。那android平台的不应该没有啊?继续在android平台的libSNPE.so里找,终于找到
c++filt _ZN3zdl8DlSystem11TensorShapeC2ENSt6__ndk16vectorImNS2_9allocatorImEEEE
zdl::DlSystem::TensorShape::TensorShape(std::__ndk1::vector<unsigned long, std::__ndk1::allocator<unsigned long> >)
看着像,但是和平常见到的是不太一样,vector的定义是std::__ndk1::vector。这说明SNPE链接的是LLVM的标准libc++库。这样原因清楚了。我们编译使用的是cmake,最开始在build.gradle文件中并没有指定ANDROID_STL变量,编译使用的应该不是libc++库,导致了链接错误。(按照NDK文档的说法,ANDROID_STL默认的是c++_static,这是libc++的静态库。按理是能够链接通过的,实际也试过了,ANDROID_STL指定c++_static是能够编译通过的。但是不指定,就会出现上面的undefined reference错误。我怀疑默认使用的是GNU的库)
因为还使用了opencv的库(用的是opencv3的版本),如果改用libc++,会出现链接opencv出错。查找opencv的文档,opencv4.0.0开始使用c++11库,因此改用opencv4。在build.gradle文件中加上ANDROID_STL定义,编译通过。
android {
defaultConfig {
externalNativeBuild {
cmake {
arguments '-DANDROID_STL=c++_shared'
}
}
}
}
按NDK的文档,从NDK r18开始,libc++成为NDK中唯一可用的STL。因为我们使用的NDK版本还比较低,所以开始并没有出错。随着NDK升级,不仅r18开始libc++是唯一的STL,而且gcc也不再支持,只能使用clang。还是慢慢转过去了,以免出现一些莫名其妙的问题。
原文链接:https://www.cnblogs.com/mightycode/p/12510742.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 一个工业级、跨平台、轻量级的 tcp 网络服务框架:gevent 2020-06-05
- C++ 在名称空间中使用using声明和using编译指令 2020-05-29
- 1.ffmpeg、ffplay、ffprobe命令使用 2020-05-11
- 关于使用ffmpeg的一些牢骚 2020-05-08
- Android P HIDL demo代码编写 (原创) 2020-05-07
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash