博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS链接库的冲突
阅读量:6587 次
发布时间:2019-06-24

本文共 2244 字,大约阅读时间需要 7 分钟。

最近在打包的时候,遇到一个坑。特此记录一下

 

起因是发现 Unity 5.4 版本,使用c#写的下载,下载速度无法突破 2M/s,同样的网络,后来横向对比使用原来 Cocos2d 开始的游戏,可以达到 7M/s。海外推广一般是小包(iOS是150M以内,安卓50M以内) + 扩展包,如果下载速度过慢,对市场推广和用户转化都会有影响(下载等待时间变长了)。然后就决定基于 libcurl 写了一个C++的下载模块,以替换现有的 C# 下载模块。

 

韩国版本在添加了下载模块进行测试时,遇到了崩溃。使用 Release Run 时,在下载补丁那里必崩(编译是正常的),崩溃的地方是在 curl_easy_init 就挂掉了,很神奇。

 

最初怀疑是库的添加顺序,尝试调整顺序后发现不是。然后使用排除法,删相关的库,发现有一个库看上去有点奇怪,解压出来发现里面引用了 OpenSSL库,而我们的下载模块也用到了这个库。到这里原因就找到了,因为.a静态库与 第三方的 framework 有冲突(我们使用4个.a文件)。解决方案就是使用 .framework动态库,将4个.a整合成一个动态的.framework,然后添加到Xcode里。

 

问题解决后,在网上搜索了相关的资料。把相关的知识再重新梳理一遍。

 

库(Library)分为:静态链接库、动态链接库,下面将三大主流平台动态、静态库做一个简单的对比。

平台

静态库

动态库

Windows *.lib *.dll
Linux *.a *.so
Mac OS *.a,*.framework *.dylib,*.tbd,*.framework

你可能会奇怪,为啥 *.framework 既是动态库又是动态库,系统的 framework 是动态库(Real Framework),我们建立的 framework 是静态库(或者称为伪动态库 —— Fake Framework)。

 

下面是二个链接,使用 Xcode  build 出 iOS 可使用的 Framework

 

iOS 系统的 UIKit.framework 不需要拷贝到目标程序中,我们生成的 Framework 即便是动态的,最后还是需要拷贝到App中,因此苹果又把这种 framework 称为 Embedded Framework。

 

为什么这么修改就可以了呢?  iOS中的Embedded Framework可以理解为独立的没有main函数的可执行文件。这样就避免冲突了

 

注:需要注意的是 iOS 8之前是不支持动态库的,只支持静态库。

image

 

否则,会报错。

dyld: Library not loaded: @rpath/xx.framework/xx

Referenced from: /var/containers/Bundle/Application/xxx/xx.app/app

Reason: image not found

 

每次手工将 framework 拖到 xcode肯定是很蛋疼的,增好 Unity 提供了 来解决这个问题。

使用  PBXProjectExtensions 类的 AddFileToEmbedFrameworks 方法

 

using UnityEditor.iOS.Xcode.Custom;string targetName = PBXProject.GetUnityTargetName();PBXProject proj = new PBXProject();proj.ReadFromString(File.ReadAllText(projPath));string target = proj.TargetGuidByName(targetName);string strOSVersion = PlayerSettings.iOS.targetOSVersionString;string strMajorVersion = strOSVersion.Split('.')[0];if (int.Parse(strMajorVersion) >= 8){    proj.AddFileToBuild(target, proj.AddFile("Frameworks/xx.framework", "Frameworks/xx.framework", PBXSourceTree.Source));        const string defaultLocationInProj = "Frameworks/xx/";    const string coreFrameworkName = "xx.framework";    string framework = Path.Combine(defaultLocationInProj, coreFrameworkName);    string fileGuid = proj.AddFile(framework, "Frameworks/" + framework, PBXSourceTree.Sdk);    PBXProjectExtensions.AddFileToEmbedFrameworks(proj, target, fileGuid);}

 

 

 

更多参考链接:

转载于:https://www.cnblogs.com/meteoric_cry/p/9179023.html

你可能感兴趣的文章
csa Round #66 (Div. 2 only)
查看>>
BIT+DP
查看>>
智能指针
查看>>
day32--面向对象的程序设计之继承实现的原理(继承顺序)、封装、property
查看>>
虚拟机全屏问题
查看>>
942. DI String Match
查看>>
spring
查看>>
java_oop_方法2
查看>>
tomcat集群
查看>>
java_生态环境
查看>>
笔记-人老了-github
查看>>
https域名强弱校验的区别
查看>>
MariaDB 10.3 instant ADD COLUMN亿级大表毫秒级加字段
查看>>
堆结构导致数据文件不能收缩
查看>>
linux运维常见英文报错中文翻译(菜鸟必知)
查看>>
微软私有云Azure Pack实践系列之三创建虚拟机角色
查看>>
Exchange 2010 UM角色安装后无法启动服务,错误 1000,1001
查看>>
运维的核心竞争力是什么
查看>>
.NET Micro Framework开发板用户简明手册(v3.0)
查看>>
Gartner:智能SOC/情报驱动的SOC的五大特征
查看>>