【问题标题】:How can I get the Xcode linker to remove duplicate symbols it finds?我怎样才能让 Xcode 链接器删除它找到的重复符号?
【发布时间】:2023-01-26 00:08:21
【问题描述】:

所以我最近将一个通用/胖框架转换为 XCFramework,我需要在应用程序中用新的 XCFramework 替换旧框架。

该应用程序具有以下链接器标志:

OTHER_LDFLAGS = -ObjC -force_load path/to/FrameworkName.framework/Versions/A/FrameworkName -lstdc++

迁移到 XCFramework,为了在 XCFramework 中使用正确的框架,我认为执行以下操作是有意义的:

OTHER_LDFLAGS[sdk=iphoneos*] = -ObjC -force_load path/to/FrameworkName.xcframework/ios-arm64/FrameworkName.framework/Versions/A/FrameworkName -lstdc++
OTHER_LDFLAGS[sdk=iphonesimulator*] = -ObjC -force_load path/to/FrameworkName.xcframework/ios-arm64_x86_64-simulator/FrameworkName.framework/Versions/A/FrameworkName -lstdc++

在构建时,Xcode 找不到 XCFramework 的标头,很可能是因为 FRAMEWORK_SEARCH_PATHS(我们过去一直使用)不适用于 XCFrameworks。因此,我还将 XCFramework 添加到“Link Binary With Libraries”构建阶段,以便让 Xcode 找到标头。

问题来了。 Xcode 现在告诉我有重复的符号,可能是因为我将 XCFramework 添加到“Link Binary With Libraries”构建阶段,并且还使用链接器标志强制加载了内部静态库。我必须做后者,以便链接静态库的全部内容,但我也必须做前者,否则 Xcode 找不到标题。

有没有办法(也许是另一个链接器标志)让 Xcode 链接器删除它找到的重复符号?或者作为替代方案,有没有一种方法可以让 Xcode 找到 XCFramework 标头,而不必将 XCFramework 添加到“Link Binary With Libraries”构建阶段?

我还应该补充一点,删除 -ObjC 链接器标志可以解决问题,但我不想冒险破坏其他正在链接的框架中的任何内容(因为该标志链接静态分析无法解析为直接调用的 Objective-C 代码) .如果需要,我愿意提供更多信息。

【问题讨论】:

    标签: ios objective-c xcode clang xcframework


    【解决方案1】:

    您根本不需要在 OTHER_LDFLAGS 中列出框架。您应该只将 xcframework 添加到“Link Binary With Libraries”并将其从 OTHER_LDFLAGS 中删除。 xcframeworks 的重点是您不需要提供正确架构的完整内部路径。

    这与 -ObjC 标志无关。这仍然在您的 OTHER_LDFLAGS 中。请注意,这与 -force_load 是多余的。 -force_load 是 Xcode 4 之前的错误的解决方法。有关详细信息,请参阅QA1490。解决方法建议已于 2014 年删除。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-05
      • 1970-01-01
      • 2021-07-06
      • 2021-05-27
      • 2012-01-16
      • 2020-11-30
      • 1970-01-01
      • 2014-07-24
      相关资源
      最近更新 更多