美文网首页
iOS ncnn静态库冲突崩溃问题

iOS ncnn静态库冲突崩溃问题

作者: Accepted_ | 来源:发表于2020-11-20 15:51 被阅读0次

ncnn为腾讯开源算法,很多第三方都使用到了ncnn,但大家使用的版本可能都不一致。由于iOS静态库的特性,会导致两个使用不同版本ncnn的第三方同时集成进项目后出现崩溃的问题。(可能出现一个第三方不崩溃但另外一个崩溃的问题)。这种问题解决方法有两个:

*方法一:找到项目里所有用到ncnn的第三方一起联调,使用同一个版本的ncnn然后重新编译各自的静态库。(且如果有对ncnn源码做修改的话,不可以修改已有的逻辑。比方说你添加个自定义的layer没有问题,但你准备修改某个函数里的if判断就不行)

*方法二:第三方给自己使用的ncnn源码加上独有的命名空间(namespace,原namespace为ncnn)。

很多项目集成了非常多的第三方,想确定具体哪个使用到ncnn会非常麻烦。而且有时甚至会和腾讯官方的产品冲突,而腾讯官方ncnn版本号是类似V1.0这样的,不是对我们开源的日期格式的版本号。根本无法通过统一ncnn代码来解决冲突。 github上ncnn版本号

所以比较推荐的是第二种方法,虽然麻烦点,但一劳永逸。


以下是修改步骤:
第一步:下载源码:Releases · Tencent/ncnn,我下载的是20200916版本。

20200916版本ncnn

第二步:修改src文件夹里所有的namespace ncnnnamespace xyncnn
ncnn代码文件有400+,一个一个改要改到地老天荒👋。

搜索结果显示有400+文件

我们可以借用XCode搜索功能的兄弟:replace功能修改(快夸我机智)。建一个工程(任意工程,静态库工程或者APP工程均可,主要是为了把ncnn零散的代码拖入XCode,然后使用XCode的替换功能),把src文件夹拖进去,拖入时不要勾选Copy Items If needed以保证我们修改的是原始文件。

拖入选项
拖入后,使用搜索功能,注意左上角要把Find改为Replace。搜索框输入namespace ncnn,文本替换框输入想要修改的名字例如namespace xyncnn,然后点击Replace All按钮。按Command+B保存所有文件。(Command+B是编译命令,这里只为了一键保存所有文件,编译报错不用管)
ncnn替换
使用命名空间的地方不要忘记了。全文搜索ncnn::修改。Command+B保存所有文件。
ncnn::替换

还有namespace cvcv::也要替换。别忘记Command+B保存所有文件。

cv替换
cv::替换

第三步:零零碎碎的配置文件、代码文件中的namespace修改。
1.在下载的ncnn开发包里搜索namespace ncnn,搜索结果以文件类型排序,然后滚到最后,可以发现ncnn_add_layer.cmake文件骨骼精奇脱颖而出。

ncnn开发包目录搜索namespace ncnn结果
我们用文本编辑.app打开它,全文搜索namespace ncnn,只有6个,建议一个一个看,需要替换再替换。
ncnn_add_layer.cmake的命名空间替换

还有一个地方竟然还有代码。(是我make -j4到99%的时候报错发现的💩……),在与src文件夹并列的benchmark文件夹内,搜索ncnn关键字。

benchmark搜索ncnn结果
搜索结果中打开benchncnn.cpp,全文替换ncnn::
ncnn::全文替换

第四步:替换工作完毕,编译ncnn库。
移步简书:iOS 编译ncnn静态库 有非常详细的步骤。
编译好真机库和模拟器库之后合并就可以使用了。

不同版本ncnn可能会大同小异,具体问题可以在make -j4报错后的错误提示进行判断。

相关文章

  • iOS ncnn静态库冲突崩溃问题

    ncnn为腾讯开源算法,很多第三方都使用到了ncnn,但大家使用的版本可能都不一致。由于iOS静态库的特性,会导致...

  • 解决iOS静态库文件冲突

    iOS 静态库冲突 两个不同的.o 文件冲突 ,静态库分离

  • iOS 编译ncnn静态库

    ncnn官方在github上有编译好的静态库可以直接使用。但如果需要修改ncnn代码的话就只能自己编译了。 源码及...

  • 静态库冲突 & Git (20)

    静态库冲突 & Git (20) 静态库冲突 冲突本质 -Objc 以及 -all_load 都没有问题, 都可以...

  • iOS 解决.a 静态库冲突问题

    今天碰到恶心的libSBJSON.a(千度公司出品) 和ArcGIS 冲突了和它们聊过之后它们决定不改。那只有自己...

  • iOS 静态库

    iOS 静态库 iOS 静态库

  • iOS静态库之间互调冲突问题

    研究目的 1. 在其他静态库(B静态库)中导入公共静态库(A静态库),想直接使用公共静态库(A静态库)中的方法和m...

  • MT MD 讲解

    (114条消息) 静态库、动态库、静态链接、动态链接、系统运行库混合、MD MT默认库冲突问题wxlfreewin...

  • lib(a)导致的duplicate symbol的问题

    链接: IOS lib(.a)库冲突解决办法 iOS 两个静态库存在同名文件冲突解决方案 说明 首先你要确定是这个...

  • iOS 静态库开发

    iOS 静态库开发 本文旨在说明静态库制作中的一些常见问题和特殊处理1. 打包静态库需要的相关问题和设置 静态库中...

网友评论

      本文标题:iOS ncnn静态库冲突崩溃问题

      本文链接:https://www.haomeiwen.com/subject/nhbdiktx.html