当前位置: 首页 > news >正文

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

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的制作 - 习武的个人博客感谢👍🏻

相关文章:

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

1.1库的概念 库:程序代码的集合,编译好的二进制文件加上头文件供使用,共享程序代码的一种方式。 1.2库的分类 根据开源情况分为:开源库(能看到具体实现)、闭源库(只公开调用的的接口&#xf…...

C++ | Leetcode C++题解之第552题学生出勤记录II

题目&#xff1a; 题解&#xff1a; class Solution { public:static constexpr int MOD 1000000007;vector<vector<long>> pow(vector<vector<long>> mat, int n) {vector<vector<long>> ret {{1, 0, 0, 0, 0, 0}};while (n > 0) {…...

网站架构知识之Ansible(day020)

1.Ansible架构 Inventory 主机清单:被管理主机的ip列表,分类 ad-hoc模式: 命令行批量管理(使用ans模块),临时任务 playbook 剧本模式: 类似于把操作写出脚本,可以重复运行这个脚本 2.修改配置 配置文件&#xff1a;/etc/ansible/ansible.cfg 修改配置文件关闭主机Host_key…...

K8s使用nfs

改动点 ip和路径改为自己的 --- apiVersion: v1 kind: ServiceAccount metadata:name: nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: nfs-client --- kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata:nam…...

【大数据学习 | kafka高级部分】kafka的kraft集群

首先我们分析一下zookeeper在kafka中的作用 zookeeper可以实现controller的选举&#xff0c;并且记录topic和partition的元数据信息&#xff0c;帮助多个broker同步数据信息。 在新版本中的kraft模式中可以这个管理和选举可以用kafka自己完成&#xff0c;而不再依赖zookeeper。…...

爬虫策略规避:Python爬虫的浏览器自动化

网络爬虫作为一种自动化获取网页数据的技术&#xff0c;被广泛应用于数据挖掘、市场分析、竞争情报等领域。然而&#xff0c;随着反爬虫技术的不断进步&#xff0c;简单的爬虫程序往往难以突破网站的反爬虫策略。因此&#xff0c;采用更高级的爬虫策略&#xff0c;如浏览器自动…...

Hive 实现查询用户连续三天登录记录

标题&#xff1a;Hive 实现查询用户连续三天登录记录 在数据分析和处理中&#xff0c;经常会遇到需要查询特定条件数据的情况。本文将介绍如何使用 Hive 来查询用户连续三天登录的所有数据记录。 一、问题背景 我们有一个用户登录记录表&#xff0c;其中包含用户的登录日期信…...

OceanBase 4.3.3 功能解析:列存副本

OceanBase 从4.3.0 版本开始&#xff0c;引入了列式存储的支持。用户可以根据业务的具体需求&#xff0c;选择创建列存表、行存表或是行列混存表。无论选择哪种表类型&#xff0c;在不同的Zone内&#xff0c;租户使用的副本模式都是一致的。详见官网文档&#xff1a; https://w…...

2.Python解释器

python解释器程序&#xff0c;用来翻译python代码&#xff0c;并提交给计算机执行。 上一篇博客就是安装了python解释器程序 写一个python文件&#xff0c;在文件中写入多行代码并执行&#xff1a; 进入python后&#xff0c;输入exit()命令退出...

鸿蒙与团结引擎c#与ts简单交互

目录 团结中调用ts代码 鸿蒙中调用团结代码 首先在团结创建代码&#xff0c;需要将代码添加到场景物体中 devecoStudio端编写ts代码 在index页面添加一个测试按钮 团结中调用ts代码 团结引擎 - 手册: Call TypeScript plug-in code from C# scripts 注册函数要跟文件名一致 在u…...

Any 的原理以及实现

序言 在 C17 的更新中引入了一个特别有意思的类型&#xff0c;它提供了一种通用的方式来存储任何类型的数据而不需要提前指定类型&#xff0c; 该类型就是 any。  any 允许你将任意类型的数据存储在一个容器中&#xff0c;并且能够在运行时动态地访问该数据。话不多说&#xf…...

SQLI LABS | Less-35 GET-Bypass Add Slashes (we dont need them) Integer Based

关注这个靶场的其它相关笔记&#xff1a;SQLI LABS —— 靶场笔记合集-CSDN博客 0x01&#xff1a;过关流程 输入下面的链接进入靶场&#xff08;如果你的地址和我不一样&#xff0c;按照你本地的环境来&#xff09;&#xff1a; http://localhost/sqli-labs/Less-35/ 话不多说…...

RNN(循环神经网络)详解

1️⃣ RNN介绍 前馈神经网络&#xff08;CNN&#xff0c;全连接网络&#xff09;的流程是前向传播、反向传播和参数更新&#xff0c;存在以下不足&#xff1a; 无法处理时序数据&#xff1a;时序数据长度一般不固定&#xff0c;而前馈神经网络要求输入和输出的维度是固定的&a…...

【AI抠图整合包及教程】探索SAM 2:图像与视频分割领域的革新者

在人工智能的浩瀚星空中&#xff0c;Meta公司的Segment Anything Model 2&#xff08;SAM 2&#xff09;犹如一颗璀璨的新星&#xff0c;以其前所未有的图像与视频分割能力&#xff0c;照亮了计算机视觉领域的新航道。SAM 2不仅继承了其前身SAM在零样本分割领域的卓越表现&…...

DevExpress中文教程 - 如何使用AI模型检查HTML编辑中的语法?

DevExpress .NET MAUI多平台应用UI组件库提供了用于Android和iOS移动开发的高性能UI组件&#xff0c;该组件库包括数据网格、图表、调度程序、数据编辑器、CollectionView和选项卡组件等。 目前许多开发人员正在寻找多种方法将AI添加到解决方案中&#xff08;这通常比想象的要…...

python包管理工具pip和conda的使用对比

python包管理工具pip和conda的使用对比 总述1. pip使用2. conda注意虚拟环境之间的嵌套&#xff0c;这个会导致安装包后看不到包&#xff0c;实际是安装到了base环境里 未完待续 总述 pip相对于conda,对应包的依赖关系管理不强&#xff0c;坏处是容易造成包冲突&#xff0c;好…...

Linux案例:DNS服务器配置

Linux案例&#xff1a;DNS服务器配置 实验一&#xff1a;正向解析 服务端配置&#xff1a; [rootserver ~]# setenforce 0 [rootserver ~]# nmcli c modify ens160 ipv4.method manual ipv4.addresses 192.168.70.131/24 ipv4.gateway 192.168.70.2 ipv4.dns 114.114.114.11…...

【Python】__getitem__()方法

getitem() 方法介绍 __getitem__ 方法是 Python 中的一个特殊方法&#xff08;也被称为魔术方法或特殊方法&#xff09;&#xff0c;用于在类中实现索引访问对象元素的操作。这个方法允许对象实现类似于列表、字典等容器类型的索引操作。当自定义类中定义了 __getitem__ 方法时…...

《Atomic Picnic》进不去游戏解决方法

Atomic Picnic有时候会遇到进不去游戏的情况&#xff0c;这可能是由多种原因造成的&#xff0c;玩家可以采取很多解决方法&#xff0c;比如检查电脑配置、更新系统和驱动或验证游戏文件。 Atomic Picnic进不去游戏怎么办 检查电脑配置 查看自己的电脑配置是否达到了游戏的要求…...

学习日志007--python函数 学完再练习练

函数小练习 一、函数的概念 1.定义 函数是组织好的&#xff0c;可重复使用的&#xff0c;用来实现单一&#xff0c;或相关联功能的代码段。 2.作用 函数能提高应用的模块性&#xff0c;和代码的重复利用率 3.定义 函数代码块以 def 关键词开头&#xff0c;后接函数标识符…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时&#xff0c;没有加载所有类库。插件运行过程中用到某个类库&#xff0c;会从CAD的安装目录找&#xff0c;找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库&#xff0c;就用插件程序加载进…...