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

问题描述 投票:0回答:1

我遇到一个问题,应用程序使用两个动态框架,这两个框架都链接到同一个静态库。这两个框架都在其二进制文件中包含静态库的符号。这会导致应用程序中出现重复的符号。

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

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

注释

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

解决方案

假设您有两个名为

DF1
DF2
的动态框架,它们都链接到名为
SL
的同一个静态库。

我找不到一种方法来构建

DF1
DF2
,使其链接到
SL
,同时从二进制文件中排除
SL
的符号。

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

  1. 引入一个新的动态框架 –
    DF
    – 链接到
    SL
    1
  2. 更改
    DF1
    DF2
    以链接到
    DF
    而不是
    SL
    2
  3. 更改应用程序,使其链接到
    DF
    以及
    DF1
    DF2
    3

可合并库

WWDC 2023 的

认识可合并库演讲的可合并库的好处部分提供了希望。在那次演讲中,演讲者说:

...合并时,链接器可以在所有库中删除重复内容,例如字符串。例如,它删除了冗余符号引用、Objective-C 选择器和 obj_msgsend 存根...

我将尝试可合并的库并更新我的答案以确认或否定它是否解决了手头的问题。

1SL
的符号将在
DF
的二进制中。

2DF
的符号不会出现在
DF1
DF2
的二进制文件中。

3应用程序现在将仅从 SL
 获取 
DF
 的符号。
© www.soinside.com 2019 - 2024. All rights reserved.