本文都是以 Swift
为基础做测试的.
静态库 嵌套 其他静态库
在你的项目中, 使用了一个静态库, 它里面嵌套了另一个静态库.
- 如果这个静态以
Embed
(嵌套) 的形式引入另一个静态库, 那么嵌套的静态库会包含在当前的静态库的Frameworks
文件夹中, 如下:
虽然包含, 但在其他项目使用这个静态库的时候, 并不会动态的把依赖的静态库link
到这个项目, 直接build
会报如下错误:
需要自己手动link
嵌套的framework
, 如下图:
把那个依赖库拖入到Build Phases
->Link Binary With Libraries
, 即可解决上面的错误 - 如果以
Do Not Embed
的形式引入另一个静态库, 构建这个静态库, 它本身就不包含Frameworks
文件夹, 需要找到那个依赖的库, 并且拖入到Build Phases
->Link Binary With Libraries
动态库 嵌套 其他静态库
与上面的基本相同, 但使用时, 不需要 link
嵌套的 framework
, 拖入即可以使用.
即使在动态库中, 对这个静态库 Do Not Embed
, 在项目中使用动态库的时候依然不需要拖入这个静态库.
所以动态库引入其他静态库, 无论是 Embed
还是 Do Not Embed
, 都会把其他的静态库嵌入到本身, 而且你还可以在你的项目中通过 import StaticFramework
的形式引入这个静态库, 使用他的 public
部分, 但是无法查看 API
, 查看的时候会显示:
动态库 嵌套 其他动态库
当前的项目可以给引入的 framework
进行签名, 但是不可以给这个 framework
嵌套的动态库签名, 所以如果你的动态库嵌套其他的动态库, 需要在你构建动态库的时候给他签名, 但是这种签名之后就无法被其他 team
使用, 如下:
如果在动态库引入另一个动态库使用:
- 选择了
Embed & Sign
, 则需要上面所描述的 - 选择了
Embed & Without Signing
, 这个不可以应用在两个动态库嵌套, 会出现如下错误
dyld: Library not loaded: @rpath/StaticFramework.framework/StaticFramework
Referenced from: /private/var/containers/Bundle/Application/AC3BE487-EB49-4DEB-AD3D-787856606C23/SwiftTest.app/Frameworks/StaticFramework2.framework/StaticFramework2
Reason: no suitable image found. Did find:
/private/var/containers/Bundle/Application/AC3BE487-EB49-4DEB-AD3D-787856606C23/SwiftTest.app/Frameworks/StaticFramework2.framework/Frameworks/StaticFramework.framework/StaticFramework: code signature in (/private/var/containers/Bundle/Application/AC3BE487-EB49-4DEB-AD3D-787856606C23/SwiftTest.app/Frameworks/StaticFramework2.framework/Frameworks/StaticFramework.framework/StaticFramework) not valid for use in process using Library Validation: mapped file has no cdhash, completely unsigned? Code has to be at least ad-hoc signed.
(lldb)
- 选择了
Do Not Embed
, 表示这个动态库不嵌入, 但依赖这个库, 所以在使用时需要同时引入这两个动态库.
所以动态库尽量不要嵌套其他动态库, 而是在项目中同时引入两个动态库进行使用.
静态库 嵌套 其他动态库
如果在静态库引入另一个动态库使用:
- 选择了
Do Not Embed
, 则需要在项目中同时引入两个库, 因为静态库依赖那个动态库, 但没有嵌入. - 选择了
Embed & Sign
, 与静态库 嵌套 其他静态库
相同, 需要拖入依赖的动态库
总结:
-
Static Framework
无论选择Do Not Embed
, 还是Embed & Sign
, 都不会动态连接依赖的库, 需要手动链接.
但选择Embed
的静态库, 会把依赖的库一起打包到它本身. 如下:
如果选择Do Not Embed
, 就不会包含Frameworks
这个文件夹. Dynamic Framework
1.嵌套静态库, 始终会把静态库嵌入其中.
2.引入动态库, 选择Do Not Embed
, 则需要在使用的时候引入依赖的动态库
选择Embed
需要对内嵌的动态库进行签名, 而且签名过的库, 只允许同一个Team
使用.
所以无论静态库还是动态库都尽量不要嵌套使用, 而是以依赖的方式引用, 这样才更优雅一些.
IPA processing failed
上传到 AppStore
不可以包含 x86_64
和 i386
lipo <文件夹/文件> -remove x86_64 -o <文件夹/文件> // 去除x86_64
Todo: Found an unexpected Mach-O header code: 0x72613c21
Static Library 不可以以嵌入的方式, 而是在 Build Phases
-> Link Binary With Libraries
中引用.
如果加入到 Embed Frameworks
中, 就会报上面的错误
目前没有测试动态 framework
以嵌入的方式引用静态 framework
, 是否会报错.