iOS ncnn静态库冲突崩溃问题
ncnn为腾讯开源算法,很多第三方都使用到了ncnn,但大家使用的版本可能都不一致。由于iOS静态库的特性,会导致两个使用不同版本ncnn的第三方同时集成进项目后出现崩溃的问题。(可能出现一个第三方不崩溃但另外一个崩溃的问题)。这种问题解决方法有两个:
*方法一:找到项目里所有用到ncnn的第三方一起联调,使用同一个版本的ncnn然后重新编译各自的静态库。(且如果有对ncnn源码做修改的话,不可以修改已有的逻辑。比方说你添加个自定义的layer没有问题,但你准备修改某个函数里的if判断就不行)
*方法二:第三方给自己使用的ncnn源码加上独有的命名空间(namespace,原namespace为ncnn
)。
所以比较推荐的是第二种方法,虽然麻烦点,但一劳永逸。
以下是修改步骤:
第一步:下载源码:Releases · Tencent/ncnn,我下载的是20200916版本。
第二步:修改src
文件夹里所有的namespace ncnn
为namespace xyncnn
ncnn代码文件有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 cv
和cv::
也要替换。别忘记Command+B保存所有文件。
cv::替换
第三步:零零碎碎的配置文件、代码文件中的namespace修改。
1.在下载的ncnn开发包里搜索namespace ncnn
,搜索结果以文件类型排序,然后滚到最后,可以发现ncnn_add_layer.cmake
文件骨骼精奇脱颖而出。
我们用文本编辑.app打开它,全文搜索
namespace ncnn
,只有6个,建议一个一个看,需要替换再替换。ncnn_add_layer.cmake的命名空间替换
还有一个地方竟然还有代码。(是我make -j4到99%的时候报错发现的💩……),在与src
文件夹并列的benchmark
文件夹内,搜索ncnn
关键字。
搜索结果中打开
benchncnn.cpp
,全文替换ncnn::
ncnn::全文替换
第四步:替换工作完毕,编译ncnn库。
移步简书:iOS 编译ncnn静态库 有非常详细的步骤。
编译好真机库和模拟器库之后合并就可以使用了。
不同版本ncnn可能会大同小异,具体问题可以在
make -j4
报错后的错误提示进行判断。