所以我最近把一个通用/胖框架转换成了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,以便让Xcode找到头文件。
问题来了。Xcode现在告诉我有重复的符号,可能是因为我在“Link Binary With Libraries”构建阶段添加了XCFramework,并且还使用链接器标志强制加载了内部静态库。我必须执行后一种操作,这样静态库的全部内容都将被链接,但我也必须执行前一种操作,因为Xcode无法找到标头。
有没有一种方法(可能是另一个链接器标志)可以让Xcode链接器删除它找到的重复符号?或者作为替代,有没有一种方法可以让Xcode找到XCFramework头文件,而不必将XCFramework添加到“将二进制文件与库链接”构建阶段?
我还应该补充一点,移除-ObjC链接器标志可以解决这个问题,但我不想冒险破坏其他被链接框架中的任何东西(因为该标志链接了静态分析无法解析为直接调用的Objective-C代码)。
1条答案
按热度按时间hgb9j2n61#
你根本不需要把框架列在OTHER_LDFLAGS中,你只需要把xcframework添加到“Link Binary With Libraries”中,然后从OTHER_LDFLAGS中删除它,xcframework的关键在于你不需要提供正确架构的完整内部路径。
这与
-ObjC
标志无关。它仍然存在于OTHER_LDFLAGS中。请注意,这对于-force_load
来说是多余的。-force_load
是Xcode 4之前的一个bug的变通方案。有关详细信息,请参见QA1490。变通方案建议已于2014年删除。