我有一个应用程序链接到两个动态框架,这两个动态框架都链接到同一个静态库,如下所示:
|--App
|--DynamicFramework1
|--StaticLibrary
|--DynamicFramework2
|--StaticLibrary <- the same library that DynamicFramework1 links to
由于动态框架默认构建的方式,静态库的符号包含在每个框架的二进制文件中。因此,应用程序会在运行时查找静态库符号的重复项。
是否可以将动态框架链接到静态库(并在动态框架内引用静态库的类和方法),从而将静态库中的符号从动态框架的二进制文件中排除?
我这样做的希望是两个动态框架的二进制文件都将排除静态库的符号。然后,我将使应用程序负责直接链接到静态库。
注释
- 到目前为止,我已经尝试以两种不同的方式将动态框架与静态库链接起来:(1)我将静态库添加到框架的“链接二进制与库”构建阶段; (2) 我在框架的“其他链接器标志”build设置中引用了静态库。两者都会导致静态库的符号包含在框架的二进制文件中。
- 我知道,将框架目标的“Mach-O 类型”从“动态框架”更改为“静态库”将构建框架的二进制文件,而无需其链接到的静态库的符号。我希望将我的框架保留为动态框架,以便 (1) 我可以受益于 Xcode 如何自动将动态框架的资源(字符串、 Storyboard等)捆绑在一起; (2) 我的框架的用户可以受益于 Mergeable Libraries在不久的将来。
- 我知道可以通过将静态库更改为动态框架来解决这个问题。我想尽可能避免这种情况,因为静态库是来自第三方的二进制文件。如果可以的话,我想避免 fork 静态库的源代码并弄乱其构建脚本。
- 参见here一个演示该问题的最小 Xcode 项目。
最佳答案
解决方案
假设您有两个名为 DF1
的动态框架和DF2
它们都链接到名为 SL
的同一个静态库.
我找不到构建 DF1
的方法和DF2
他们链接到 SL
的方式同时排除 SL
的符号从他们的二进制文件中。
到目前为止我能想到的最佳解决方案如下:
- 引入新的动态框架 –
DF
– 使用-all_load
链接器标志和链接到SL
.1 - 更改
DF1
和DF2
链接到DF
而不是SL
.2 - 更改应用程序,使其链接到
DF
还有DF1
和DF2
.3
以图片形式来说,这是:
App
|--> DF1 --> DF --> SL
|--> DF2 --> DF --> SL
|--> DF --> SL
参见here用于演示此解决方法的最小 Xcode 项目。
附录
Benefits of mergeable libraries Meet mergeable libraries 部分WWDC 2023 的演讲提供了希望。在那次演讲中,演讲者说道:
... When merging, the linker can de-duplicate content, such as strings, across all libraries. For instance, it removes redundant symbol references, Objective-C selectors and obj_msgsend stubs...
我尝试过它,但遗憾的是,我无法让它解决手头的问题。 This question完美总结了我的经验。
脚注
1SL
的符号将在 DF
的二进制文件。2
DF
的符号不会出现在DF1
中和DF2
的二进制文件。3应用程序现在将获取
SL
的符号来自DF
仅有的。
关于xcode - 是否可以在没有链接到的静态库的符号的情况下构建动态框架?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77258815/