.framework类型的静态库和.a类型的静态库的优缺点及.framework类型的静态库zip压缩后解压后头文件丢失问题

简介: .framework类型的静态库和.a类型的静态库的优缺点及.framework类型的静态库zip压缩后解压后头文件丢失问题

.framework类型的静态库和.a类型的静态库各有优缺点。.framework类型的静态库使用方便,一包在手万事我有,但是会出现zip压缩后解压头文件丢失。.a类型的静态的有点是zip压缩不失真,可以按照你的需要要提供给用户头文件,不需要删除含安全信息的头文件。缺点是它不包含头文件和bundle资源文件,bundle资源文件要自己另外制作,需要你另外提供给用户。

注意:WinRAR是一个32位的程序,当mac升级到64位最新操作系统后,WinRAR无法使用。

上周我发布了一个SDK测试.framework的包,压缩为.zip后发到微信群里,结果别人解决后发现头文件的文件夹为无法识别的二禁止文件。对外接口文件不翼而飞。

强制打开是这个样子:

而压缩为zip格式前的文件夹是这样的:

真是伤心的悲剧了。分析他们的文件结构

打包的TELock.framework文件把所有头文件都给包含进来了,这是不安全,使用SDK的可能通过引入你头文件调试出你的函数逻辑。所以我只能给用户提供指定的头文件,其它头文件要删除。所以我们只保留ELockSDKSingleObject.h,BLSErrorCodeKeys.h文件和ELSBaseEntity.h头文件,其它文件都要删除。并且发现Headers,Resources,ELock和Versions下的Current等为超链接文件或文件。删除Headers的头文件,Versions下的A文件下的Headers文件夹下的文件也同时减少,Versions下的Current文件下的Headers文件夹下的文件也同时减少。说明三者下的文件实际只有一份物理文件,他们是超链接。

当采用zip压缩时,它是有损压缩,就把这种超链接结构破坏了。

如何解决呢?就是采用无损的.rar格式压缩。而mac电脑默认是zip压缩,只有rar解压缩,没有.rar压缩工具。所以要我们自己安装WinRAR,见Mac电脑如何使用WinRAR。当然你也可以采用丁丁或qq进行文件夹传送发给windows电脑,在windows电脑上进行rar压缩。

能不能有更彻底的解决办法啊?当然有了。

你打包成.a格式的包,把这个.a格式的包和你想公开的头文件发给用户,用户就能用了。.a格式的包是二进制文件不存在压缩失真问题。

.framework类型的静态库和.a类型的静态库的优缺点

1.a包需要你提供.a包,头文件,资源文件,使用这需要同时导入.a包,头文件和资源文件,就是使用者稍微麻烦些,不存在经过windows电脑采用zip压缩后发给别人解压不会出现问题。

2…framework包需要你手动删除不想让看到的头文件,使用者只需要导入.framework包就能看到头文件,正常使用。当然你忘记删除敏感的头文件就是严重的信息泄漏了。简言之就是发布包的做的事情多些,使用包的人只需要它拖入一个包就可以了。.framework因为存超链接,所以在windows用zip压缩再在其它电脑解压,这种超链接被破坏不能使用。当然你可以压缩无损的.rar包规避这个问题。

.a与.framework的区别:

一、库:

库是共享程序代码的方式,一般分为静态库和动态库

二、静态库与动态库的区别:

静态库:连接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝。

动态库:连接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存。

三、iOS静态库形式和动态库形式:

静态库:.a和.framework

动态库:.dylib和.framework

四、framework静态库和动态库的区分:

系统的.framework是动态库,我们自己建立的.framework是静态库

五、.a和.framwork的区别:

.a是一个纯二进制文件,.framework中除了有二进制文件外还有资源文件。

.a文件不能直接使用,至少要有.h文件配合,.framework文件可以直接使用。

.a + .h + sourceFile = .framework

你的SDK想生成那种类型的包,自己衡量利弊字节决定。福兮祸所伏,祸兮福所倚!


目录
相关文章
UE插件开发引用包含第三方库头文件问题总结
UE插件开发引用包含第三方库头文件问题总结
294 0
|
IDE 编译器 Linux
linux 编译 c或cpp 文件为动态库 so 文件(最简单直观的模板)
linux 编译 c或cpp 文件为动态库 so 文件(最简单直观的模板)
|
编译器 C++ Windows
C/C++ 静态库(lib)的概念和使用方法
C/C++ 静态库(lib)的概念和使用方法
483 0
|
安全 Linux 编译器
linux下封装函数库——动态库.so和静态库.a(代码实现及链接方式)
在linux环境下的链接库分为静态链接库(.a库)和动态链接库(.so库),其作用是把C程序编译好做成一种可执行链接文件,主程序文件调用这些程序的函数接口是可以使用a库或so库,在主程序中只需要include含有库中提供的函数接口声明的头文件即可。所以学会如何将自己的源代码封装成库进行使用很重要
841 0
linux下封装函数库——动态库.so和静态库.a(代码实现及链接方式)
|
C++ iOS开发
iOS开发 -- 在Xcode中引入cpp文件,并调用cpp文件中的方法
iOS开发 -- 在Xcode中引入cpp文件,并调用cpp文件中的方法
863 0
iOS开发 -- 在Xcode中引入cpp文件,并调用cpp文件中的方法
|
XML JSON 监控
Onvif开发笔记(一):使用gSOAP编译Onvif协议之gSOAP介绍与编译
Onvif开发笔记(一):使用gSOAP编译Onvif协议之gSOAP介绍与编译
Onvif开发笔记(一):使用gSOAP编译Onvif协议之gSOAP介绍与编译
|
Java Android开发 C++
【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( jni 中 main 函数声明 | 命令行处理 | jni 调用 lib7zr.so 函数库处理压缩文件完整代码 )(一)
【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( jni 中 main 函数声明 | 命令行处理 | jni 调用 lib7zr.so 函数库处理压缩文件完整代码 )(一)
210 0
【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( jni 中 main 函数声明 | 命令行处理 | jni 调用 lib7zr.so 函数库处理压缩文件完整代码 )(一)
|
Android开发 C++
【Android 安装包优化】使用 lib7zr.a 静态库处理压缩文件 ( 交叉编译 lib7zr.a 静态库 | 安卓工程导入静态库 | 配置 CMakeLists.txt 构建脚本 )(一)
【Android 安装包优化】使用 lib7zr.a 静态库处理压缩文件 ( 交叉编译 lib7zr.a 静态库 | 安卓工程导入静态库 | 配置 CMakeLists.txt 构建脚本 )(一)
170 0
【Android 安装包优化】使用 lib7zr.a 静态库处理压缩文件 ( 交叉编译 lib7zr.a 静态库 | 安卓工程导入静态库 | 配置 CMakeLists.txt 构建脚本 )(一)
|
Android开发 C++
【Android 安装包优化】使用 lib7zr.a 静态库处理压缩文件 ( 交叉编译 lib7zr.a 静态库 | 安卓工程导入静态库 | 配置 CMakeLists.txt 构建脚本 )(二)
【Android 安装包优化】使用 lib7zr.a 静态库处理压缩文件 ( 交叉编译 lib7zr.a 静态库 | 安卓工程导入静态库 | 配置 CMakeLists.txt 构建脚本 )(二)
237 0
【Android 安装包优化】使用 lib7zr.a 静态库处理压缩文件 ( 交叉编译 lib7zr.a 静态库 | 安卓工程导入静态库 | 配置 CMakeLists.txt 构建脚本 )(二)
|
计算机视觉
Qt实用技巧:win将ffmpeg、opengl、osg等各种库封装成qt模块,运行需要dll,增加自动拷贝运行库到exe目录执行脚本
Qt实用技巧:win将ffmpeg、opengl、osg等各种库封装成qt模块,运行需要dll,增加自动拷贝运行库到exe目录执行脚本