静态库、动态库、framework、xcframework、use_frameworks!的作用、关联核心SDK工程和测试(主)工程、设备CPU架构

news2024/11/25 12:22:13

1.1库的概念

库:程序代码的集合,编译好的二进制文件加上头文件供使用,共享程序代码的一种方式。

1.2库的分类

根据开源情况分为:开源库(能看到具体实现)、闭源库(只公开调用的的接口,是编译后的二进制文件,看不到具体实现,使用时链接即可。)
闭源库分为:动态库.td(之前叫.dylib)或.framework为后缀文件 和 静态库.a或.lib或.framework为后缀文件

.a纯二进制文件,.framework有二进制文件,还有资源文件。

.a 要有 .h 文件以及资源文件配合, .framework 文件可以直接使用。总的来说,.a + .h + sourceFile = .framework。所以创建静态库最好还是用.framework的形式

1.3动态库与静态库的区别 

动态库:编译时只存指向动态库的引用,链接时不复制,运行时由系统只动态加载一次到内存,不影响程序体积,多程序共用节省内存。
iOS App的动态库存放在.app bundle下的Frameworks 文件夹。

iOS平台 在 iOS8 之前,苹果不允许第三方框架使用动态方式加载,从 iOS8 开始允许开发者有条件地创建和使用动态框架,这种框架叫做 Cocoa Touch Framework。 虽然同样是动态框架,但是和系统 framework 不同。(关键字:iOS8+允有条件建和用动态库,CTF与系统f不同)

app 中使用 Cocoa Touch Framework 制作的动态库 在打包和提交 app 时会被放到 app main bundle 的根目录 中,运行在沙盒里,而不是系统中。不同的 app 就算使用了同样的 framework,但还是会有多份的框架被分别签名,打包和加载。

不过 iOS8 上开放了 App Extension 功能,可以为一个应用创建插件,这样主app和插件之间共享动态库还是可行的。

使用原理:

以 OS X 为例,当 App 启动时,操作系统内核会将 App

代码和数据载入新进程(也就是操作系统为 App创建的新进程)的地址空间。与此同时呢,操作系统内核也会把动态加载器(Dynamic Loader)载入进程,由动态加载器来完成加载App依赖的动态库。不过在启动阶段,动态加载器只会根据静态链接器中记录的

App 已链接的依赖库的名字,然后使用依赖库的 install name来查找它们是否在文件系统中存在。如果不存在或不兼容,App启动过程会中断。动态库被完全载入内存,是在代码里使用它的时候。所以相对静态库来说,使用动态库链接的App 启动过程会更快。

优点:

1)不会被加载复制到可执行文件中,按需加载,可以加快App启动。

2)维护更新方便,只要api不变,动态库变更,依赖动态库的App无需重新编译。因为重新编译主要是App的可执行文件部分,而动态库不属于其中,而是独立的,可动态加载。

缺点:有外部依赖,即程序运行期间还需要动态库的存在。

静态库:链接时会被完整的复制到可执行文件中,被多次使用就多次拷贝

编译时被直接拷贝到目标程序的可执行文件

使用原理:App自身的代码被编译成目标文件后,通过静态链接器将App的目标文件与静态库合并,并生成可执行文件。这样,App自身代码生成的目标文件与静态库都被拷贝到可执行文件中,从而让静态库也成为了App可执行文件的一部分。

特点:

1)App启动时就全部加入内存,由于使用的是静态库,不需要从外部链接加载,所以加载速度很快,但是又因为增加了内容过多导致启动速度慢。

2)静态库文件会被静态链接器链接并复制到生成的可执行文件中,导致可执行文件增大,占用内存也会增多

3)由于静态库是制作好的二进制库,如果发生变更,需要重新编译,给维护带来不便。

1.4 查看framework是动态库还是静态库,检查framework支持的架构

.framework可以是动态库也可以是静态库,系统默认设置为Dynamic,如果需要静态库需要在BuildSettings里搜索Mach-O Type改成Static Library  .a静态库  

1.4.1查看framework是动态库还是静态库(xcode6下默认是动态库)

cd framework所在目录

查看framework是动/静态库:

file framework下的二进制文件(一般与framework同名)

 静态库包含“current ar archive random library”字样。动态库包含“dynamically linked shared library”字样

静态库包含“current ar archive random library”字样。动态库包含“dynamically linked shared library”字样

1.4.2检查framework支持的架构

检查framework支持的架构:

lipo -info 该framework名称

要公开的头文件Targets->BuildPhases->Headers可以设置Public暴露在外的头文件、Private、Project

1.4.3实际使用:新建framework

1.新建 项目 选CocoaTouch Framework类型

2.设定Deployment Target部署目标

3.framework默认是动态库,但若不需要使用动态库,可以在build Settings里搜索Mach-O Type设置为Static Library静态库

若必须使用动态库,则需要在类库的工程中的General 或其他位置做如下配置 Embed Framworks(现在Xcode版本里是Embed App Extennsionns) 添加framwork

Linked Binary With Libraries(连接二进制与库) 与  Embedded Framework的区别:前者不会拷贝到 App 里的,Embedded ( 嵌入式的)Framework会拷贝到 App 里。

4.引入源码并设置SDK用户可见的文件然后编译 ,在Build Phases的Headers中设置可见的放在public里,不可见的放在project里

注意:编译后在Products下看到对应framework 若想看模拟器和真机的framework通过show in finder查看后往上层文件夹查看  因为在真机和模拟器下生成的framework只能在各自环境下使用,若真机和模拟器都能用需要将两个framework合并:用lipo -create 模拟器framework路径 真机framework路径 -output 新的文件名

1.5 use_frameworks!的作用

swift项目在platform:ios,'9.0'必须有use_frameworks!作用是把第三方库打包成静态库)

use_frameworks!用于指示CocoaPods将指定的依赖项作为框架(‌frameworks)‌来集成到项目中。支持Swift的框架兼容性,‌因为Swift项目默认使用框架形式组织代码。‌集成一些Swift的库或者需要与Swift兼容的库时,Podfile中使用use_frameworks!告诉CocoaPods不要生成静态库(‌.a文件)‌,‌而是生成框架(‌.framework)‌,‌Swift项目就能更容易地导入和使用这些库。‌

例如,‌如果你的项目中使用了Alamofire或Rac即ReactiveCocoa这样的Swift库,‌你可能会在Podfile中使用use_frameworks!来确保Alamofire以框架的形式被集成到你的项目中。‌这样做的好处之一是它允许你的Swift项目利用Swift的包管理特性,‌如更简单的依赖项导入和更好的模块兼容性。‌

在Swift中调用三方库选中target->General->Linked Frameworks and Libraries点击+添加要用的第三方库

1.6 关联核心SDK工程和测试(主)工程

运行调试闭源库 制作之后运行看效果和调试bug,总不可能每次都接入到要用SDK的工程吧,此时就需要专门的测试工程,可通过以下方式关联SDK和测试工程,Products文件夹下是编译后生成的SDK

方式1.添加Targets选择iOS的Application里的Signle View App 可以取消Include Unit/UI Tests

方式2.创建Workspace工作空间,

通过Add将两个工程都添加进去;

(5.11)Add 一个Target后 再添加另一个Target此时需要Close之前的Target才能选择Add Target到workSpace

创建以SDK命名的类;

点测试工程Targets选Build Phases找到Link Binary With Libraries将SDK与其关联起来;

Build Setting里搜索Header Search Paths的值改成SDK工程路径;

SDK的Build Settings搜索Mach-O Type改成Static Library(.Framework可能静态库或动态库,若默认编译器认为Dynamic库需要改成Static库)

1.7 设备的CPU架构(指令集)

模拟器:

4s-5: i386

5s-6s Plus: x86_64

真机(iOS设备):

armv6: iPhone、iPhone 2、iPhone 3G、iPod Touch(第一代)、iPod Touch(第二代)

armv7: iPhone 3Gs、iPhone 4、iPhone 4s、iPad、iPad 2

armv7s: iPhone 5、iPhone 5c 

arm64: iPhone 5s、iPhone 6、iPhone 6 Plus、iPhone 6s、iPhone 6s Plus、iPad Air、iPad Air2、iPad mini2、iPad mini3 及以上版本

如果打armv7s的 4s机型就不支持了, 打 armv7 的 4s-5s 都能跑

添加armv7架构

1.Architectures现在默认是$(ARCHS_STANDARA)即arm64,点+加上armv7

2.在工程文件和storyboard里都将iOS Deployment Target部署目标改成iOS 8.0(若用到SafeArea要取消使用)

遇到问题:illegal text-relocation非法文本重定位   错误解决

这个问题一般是底层库lib的编译问题。设置Build Settting ->Other linker flag 为 -read_only_relocs suppress 意思就是relocs(重定位) suppress(压制) ,不显示重定位错误

到此问题解决,成功编译出armv7架构。

   如果需要解决,那么armv7上32位的编译问题,上述的other linker就不要改了!!!!,使用下面 

尝试修改xcode中的Generate Position-Dependent Code项改成No.

    如果不能解决问题,修改Build Settings中的Strip style将其置为Non-Global Symbols 。

如果不行的话多试下,All symbols是工程默认,动态库默认为DeBugging Symbols,意思是symbols需要加载以使用Debug模式下的各种错误日志信息,以及定位信息

官方文档中对Strip Style的描述:

Defines the level of symbol stripping to be performed on the linked product of the build. The default value is defined by the target’s product type. [STRIP_STYLE]

   All Symbols - Completely strips the binary, removing the symbol table and relocation information. [all, -s]

   Non-Global Symbols - Strips non-global symbols, but saves external symbols. [non-global, -x]

    Debugging Symbols - Strips debugging symbols, but saves local and global symbols. [debugging, -S]

1.8 xcframework

XCFramework:是2019苹果官方提出的Framework的另一种先进格式,可以更方便的表示多个平台和架构的分发二进制库的格式。

需要Xcode11以上支持。

是为更好的支持Mac Catalyst和ARM芯片的macOS。

和传统的Framework相比:1>可以用单个.xcframework文件提供多个平台的分发二进制文件; 2>与Fat Header相比,可以按照平台划分,可以包含相同架构的不同平台的文件; 3>在使用时,不需要再通过脚本去剥离不需要的架构体系。

第三方个推有用到xcframework

 扩展学习:iOS开发app间账号共享与SDK封装iOS开发之App间账号共享与SDK封装 - 青玉伏案 - 博客园

参考文章:Framework与XCFramework的制作 - 习武的个人博客感谢👍🏻

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2234090.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小菜家教平台:基于SpringBoot+Vue打造一站式学习管理系统

前言 现在已经学习了很多与Java相关的知识,但是迟迟没有进行一个完整的实践(之前这个项目开发到一半,很多东西没学搁置了,同时原先的项目中也有很多的问题),所以现在准备从零开始做一个基于SpringBootVue的…

【C++、数据结构】哈希表——散列表(一)(概念/总结)

「前言」 🌈个人主页: 代码探秘者 🌈C语言专栏:C语言 🌈C专栏: C / STL使用以及模拟实现 🌈数据结构专栏: 数据结构 / 十大排序算法 🌈Linux专栏: Linux系统编…

山东路远生态科技有限公司竣工投产仪式暨产品发布会圆满举行

第二十届三中全会于2024年7月15日至18日在北京举行。全会审议通过了《关于进一步全面深化改革、推进中国式现代化的决定》。其中提到,“要健全因地制宜发展新质生产力体制机制”。 新质生产力是由技术革命性突破、生产要素创新性配置、产业深度转型升级而催生的当代先进生产力…

MD5(Crypto)

解题思路 打开文件发现一串代码,结合题目提示,应该是 MD5 加密。 找个在线的 MD5 解密网站,行云流水得到 flag。 题目设计原理 题目设计:无他,MD5 加密。 题目原理: MD5(Message-Digest Algo…

EHOME视频平台EasyCVR萤石设备视频接入平台视频诊断技术可以识别哪些视频质量问题?

EasyCVR视频监控汇聚管理平台是一款针对大中型项目设计的跨区域网络化视频监控集中管理平台。萤石设备视频接入平台EasyCVR不仅具备视频资源管理、设备管理、用户管理、运维管理和安全管理等功能,还支持多种主流标准协议,如GB28181、GB35114、RTSP/Onvif…

QML项目实战:自定义Button

目录 一.添加模块 ​1.QtQuick.Controls 2.1 2.QtGraphicalEffects 1.12 二.自定义Button 1.颜色背景设置 2.设置渐变色背景 3.文本设置 4.点击设置 5.阴影设置 三.效果 1.当enabled为true 2.按钮被点击时 3.当enabled为false 四.代码 一.添加模块 1.QtQuick.Con…

实战攻略 | ClickHouse优化之FINAL查询加速

【本文作者:擎创科技资深研发 禹鼎侯】 查询时为什么要加FINAL 我们在使用ClickHouse存储数据时,通常会有一些去重的需求,这时候我们可以使用ReplacingMergeTree引擎。这个引擎允许你存储重复数据,但是在merge的时候会根据order …

labview学习总结

labview学习总结 安装labview的特点一、图形化编程范式二、并行执行机制三、硬件集成能力四、应用领域优势五、开发效率六、系统集成能力**labview基本组成示意图****常用程序结构图解**结语 基础知识介绍界面前后面板的概念平铺式和层叠式 帧的概念结构类型顺序结构for循环whi…

Linux 服务器使用指南:从入门到登录

🌟快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。 🌟 🚩博主致力于用通俗易懂且不失专业性的文字,讲解计算机领域那些看似枯燥的知识点🚩 目录 一…

《AI 大模型:重塑软件开发新未来》

引言 在科技的璀璨星河中,AI 大模型宛如一颗耀眼的新星,正以前所未有的力量改写着软件开发的篇章。随着其技术的持续演进,软件开发流程正经历着翻天覆地的变化。从代码自动生成的神奇魔法,到智能测试的精准洞察,AI 大…

acmessl.cn提供接口API方式申请免费ssl证书

目录 一、前沿 二、API接口文档 1、证书可申请列表 简要描述 请求URL 请求方式 返回参数说明 备注 2、证书申请 简要描述 请求URL 请求方式 业务参数 返回示例 返回参数说明 备注 3、证书查询 简要描述 请求URL 请求方式 业务参数 返回参数说明 备注 4、证…

windows server2019下载docker拉取redis等镜像并运行项目

一、基本概念 1、windows server 指由微软公司开发的“Windows”系列中的“服务器”版本。这意味着它是基于Windows操作系统的,但专门设计用于服务器环境,而不是普通的桌面或个人用户使用。主要用途包括服务器功能、用户和资源管理、虚拟化等 2、dock…

Docker-- cgroups资源控制实战

上一篇:容器化和虚拟化 什么是cgroups? cgroups是Linux内核中的一项功能,最初由Google的工程师提出,后来被整合进Linux内核; 它允许用户将一系列系统任务及其子任务整合或分隔到按资源划分等级的不同组内,从而为系统…

解决ImportError: DLL load failed while importing _message: 找不到指定的程序。

C:\software\Anoconda\envs\yolov5_train\python.exe C:\Project\13_yolov5-master\train.py C:\software\Anoconda\envs\yolov5_train\lib\site-packages\torchvision\io\image.py:13: UserWarning: Failed to load image Python extension: [WinError 127] 找不到指定的程序…

超越Axure:探索新一代原型设计工具

Axure RP是一款被广泛认可的快速原型设计工具,专为专业设计师打造,用于创建高效的产品原型图,包括APP和网页的原型图、框架图和结构图等。Axure RP制作的原型图能够实现与实际APP相似的交互效果,便于向用户或客户展示,…

综合项目--博客

一。基础配置: 1.配置主机名,静态IP地址 2.开启防火墙配置 3.部分开启selinux并且配置 4.服务器之间使用同ntp.aliyun.com进行世家能同步 5.服务器之间实现SSH绵密登陆 二。业务需求 1.Sever-NFS-DNS主机配置NFS服务器,将博客网站资源…

dns欺骗

[[Ettercap]] 少不了这个 arp 毒化和流量截取的中间人工具。 dns欺骗原理 什么是 DNS 欺骗? DNS 欺骗(DNS Spoofing) 是一种网络攻击技术,攻击者通过修改 DNS 响应,将目标用户的 DNS 查询结果篡改,指向攻…

危机来临前---- 力扣: 876

危机即将来临 – 链表的中间节点 描述: 给你单链表的头结点 head ,请你找出并返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。 示例: 何解? 1、遍历找到中间节点 : 这个之在回文链表中找…

SQL Server数据库中,报错:用户名或密码不正确

1、 用户名或密码不正确 2、解决方式 可能是服务器名称不对,检查服务器名称是否是安装sqlserver数据的服务器名称。安装sqlserver数据的服务器,没有开启1433端口,需要开启端口 下一步保证:TCP/IP 状态状态为:已启用 然…

PKG_CHECK_MODULES(FUSE,fuse)

运行 ./configure 命令报错如下: ./configure: line 13934: syntax error near unexpected token FUSE,fuse ./configure: line 13934: PKG_CHECK_MODULES(FUSE,fuse)解决方案: 命令窗口运行如下命令,安装 pkg-config: sudo …