我正在尝试确定 Xcode 的新 Mergeable Libraries 功能是否可以在应用程序链接到两个都链接到同一个静态库的动态框架的情况下删除重复的符号,如下所示:
|--App
|--DynamicFramework1
|--StaticLibrary
|--DynamicFramework2
|--StaticLibrary <- the same library that DynamicFramework1 links to
以下是有关应用程序结构的一些详细信息:
StaticLibrary
。它:
SLClass1
DynamicFramework1
。它:
DF1Class1
的 Objective-C 类,它调用 SLClass1
;和MERGEABLE_LIBRARY
构建设置值为 YES
。DynamicFramework2
。它:
DF2Class1
的 Objective-C 类,它调用 SLClass1
;和MERGEABLE_LIBRARY
构建设置值为 YES
。App
。它:
ViewController
的 Swift 类,它调用 DF1Class1
和 DF2Class1
类;和MERGED_BINARY_TYPE
构建设置值为 Automatic
。1我在here创建了一个具有上述结构的最小 Xcode 项目。
合并的应用程序二进制文件在发布模式下构建时,直接包含
DF1Class1
、DF2Class1
和 SLClass1
的符号,并且仅包含每个符号的一个实例(即没有重复项)。
我的这一期望基于 WWDC 2023 演讲中的 可合并库的好处 部分,演讲者说:
合并时,链接器可以消除所有库中的重复内容,例如字符串。例如,它删除了冗余符号引用、Objective-C 选择器和 objc_msgsend 存根。实际结果
DF1Class1
、
DF2Class1
和 SLClass1
的符号,但它包含 SLClass1
符号的两个实例(即包含重复项)。 2我的问题
脚注
MERGED_BINARY_TYPE
构建设置值Manual
,但结果是相同的。2nm
命令并检查输出来验证这一点。