xcode - 是否可以在没有链接到的静态库的符号的情况下构建动态框架?

标签 xcode static-libraries static-linking dynamic-linking dynamic-frameworks

我有一个应用程序链接到两个动态框架,这两个动态框架都链接到同一个静态库,如下所示:

|--App
  |--DynamicFramework1      
    |--StaticLibrary   
  |--DynamicFramework2      
    |--StaticLibrary <- the same library that DynamicFramework1 links to

由于动态框架默认构建的方式,静态库的符号包含在每个框架的二进制文件中。因此,应用程序会在运行时查找静态库符号的重复项。

是否可以将动态框架链接到静态库(并在动态框架内引用静态库的类和方法),从而将静态库中的符号从动态框架的二进制文件中排除?

我这样做的希望是两个动态框架的二进制文件都将排除静态库的符号。然后,我将使应用程序负责直接链接到静态库。

注释

  1. 到目前为止,我已经尝试以两种不同的方式将动态框架与静态库链接起来:(1)我将静态库添加到框架的“链接二进制与库”构建阶段; (2) 我在框架的“其他链接器标志”build设置中引用了静态库。两者都会导致静态库的符号包含在框架的二进制文件中。
  2. 我知道,将框架目标的“Mach-O 类型”从“动态框架”更改为“静态库”将构建框架的二进制文件,而无需其链接到的静态库的符号。我希望将我的框架保留为动态框架,以便 (1) 我可以受益于 Xcode 如何自动将动态框架的资源(字符串、 Storyboard等)捆绑在一起; (2) 我的框架的用户可以受益于 Mergeable Libraries在不久的将来。
  3. 我知道可以通过将静态库更改为动态框架来解决这个问题。我想尽可能避免这种情况,因为静态库是来自第三方的二进制文件。如果可以的话,我想避免 fork 静态库的源代码并弄乱其构建脚本。
  4. 参见here一个演示该问题的最小 Xcode 项目。

最佳答案

解决方案

假设您有两个名为 DF1 的动态框架和DF2它们都链接到名为 SL 的同一个静态库.

我找不到构建 DF1 的方法和DF2他们链接到 SL 的方式同时排除 SL 的符号从他们的二进制文件中。

到目前为止我能想到的最佳解决方案如下:

  1. 引入新的动态框架 – DF – 使用 -all_load链接器标志和链接到 SL .1
  2. 更改DF1DF2链接到 DF而不是SL .2
  3. 更改应用程序,使其链接到 DF还有DF1DF2 .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的二进制文件。
2DF的符号不会出现在DF1中和DF2的二进制文件。
3应用程序现在将获取 SL 的符号来自DF仅有的。

关于xcode - 是否可以在没有链接到的静态库的符号的情况下构建动态框架?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77258815/

相关文章:

iphone - 如何在标签栏上绘制符号?

ios - Swift-从 ViewController 转到 UITabBarController 页面

shared-libraries - 将共享库转换为静态库

c++ - MSVS 2012 Express - Boost - 链接器错误 LNK2019

linux - NM linux命令输出含义

c++ - 在源文件 (cpp) 中定义带有静态和内联的模板函数有哪些优势?

xcode - 设置 NSSplitViews 的最小宽度

xcode - 使用 VSTS 构建 ionic 应用并将其部署到 android 和 IOS

c - 如何在Linux中编译静态库?

xcode4 - Xcode 4 中使用静态库的 header 管理