iOS ncnn静态库冲突崩溃问题

2020-11-20  本文已影响0人  Accepted_

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报错后的错误提示进行判断。

上一篇下一篇

猜你喜欢

热点阅读