提问人:Adil Hussain 提问时间:10/9/2023 最后编辑:Adil Hussain 更新时间:11/14/2023 访问量:69
是否有可能在没有它链接到的静态库的符号的情况下构建动态框架?
Is it possible to build a dynamic framework without the symbols of a static library that it links to?
问:
我有一个链接到两个动态框架的应用程序,这两个框架都链接到同一个静态库,如下所示:
|--App
|--DynamicFramework1
|--StaticLibrary
|--DynamicFramework2
|--StaticLibrary <- the same library that DynamicFramework1 links to
由于默认情况下构建动态框架的方式,静态库的符号包含在每个框架的二进制文件中。因此,应用会在运行时查找静态库符号的重复项。
是否可以将动态框架链接到静态库(并且仍然能够在动态框架中调用静态库的类和方法),从而将静态库中的符号从动态框架的二进制文件中排除?
我这样做的希望是,两个动态框架中的每一个的二进制文件都将排除静态库的符号。然后,我将让应用程序负责直接链接到静态库。
笔记
- 到目前为止,我已经尝试以两种不同的方式将我的动态框架与静态库链接起来:(1)我将静态库添加到框架的“将二进制文件与库链接”构建阶段;(2) 我在框架的“其他链接器标志”构建设置中引用了静态库。两者都会导致静态库的符号包含在框架的二进制文件中。
- 我知道将框架目标的“Mach-O 类型”从“动态框架”更改为“静态库”将构建框架的二进制文件,而无需它链接到的静态库的符号。我想将我的框架保留为动态框架,以便 (1) 我可以从 Xcode 如何自动为动态框架将资源(字符串、故事板等)捆绑在一起中受益;(2)在不久的将来,我的框架的用户可以从可合并库中受益。
- 我知道我可以通过将静态库更改为动态框架来解决这个问题。我想尽可能避免这种情况,因为静态库来自第三方。如果可以的话,我想避免分叉静态库的源代码并弄乱其构建脚本。
答:
2赞
Adil Hussain
10/12/2023
#1
解决方法
假设您有两个名为 的动态框架,它们都链接到名为 的同一个静态库。DF1
DF2
SL
我找不到一种方法来构建,并且以他们链接到的方式,同时从他们的二进制文件中排除符号。DF1
DF2
SL
SL
到目前为止,我能够提出的最佳解决方案如下:
- 引入一个新的动态框架 – – 它使用链接器标志并链接到 .1
DF
-all_load
SL
- 更改 和 链接到 而不是 。阿拉伯数字
DF1
DF2
DF
SL
- 更改应用程序,使其也链接到 和 。3
DF
DF1
DF2
在图片形式中,这是:
App
|--> DF1 --> DF --> SL
|--> DF2 --> DF --> SL
|--> DF --> SL
请参阅此处,了解演示此解决方法的最小 Xcode 项目。
附录
WWDC 2023 的“遇见可合并库”演讲的“可合并库的好处”部分提供了希望。在那次演讲中,演讲者说:
...合并时,链接器可以跨所有库删除重复的内容,例如字符串。例如,它删除了多余的符号引用、Objective-C 选择器和obj_msgsend存根......
我尝试过它,但遗憾的是,我无法让它解决手头的问题。这个问题完美地总结了我的经验。
脚注
1SL
的符号将位于 DF
的二进制文件中。2
DF
的符号不会出现在 DF1 和 DF2
的二进制文件中。
3该应用程序现在将仅从
DF
获取 SL
的符号。
评论