Ios 静态/动态库中的运行时ObjC符号冲突

Ios 静态/动态库中的运行时ObjC符号冲突,ios,objective-c,linker,static-libraries,symbols,Ios,Objective C,Linker,Static Libraries,Symbols,我正在构建一个动态库,它依赖于我以前构建的另一个静态库。静态库依赖于WebRTC。然而,新的动态库将在Swift应用程序中使用,该应用程序也依赖于WebRTC。这在构建时导致了大量符号冲突,因此我在动态库中添加了一个导出符号文件 现在动态库和Swift应用程序都构建得很好,但是当Swift应用程序启动时,我收到了很多关于重复ObjC类符号的控制台警告: objc[63026]:类RTCCVPixelBuffer在/path/to/the/dynamic/framework/binary和/pat

我正在构建一个动态库,它依赖于我以前构建的另一个静态库。静态库依赖于WebRTC。然而,新的动态库将在Swift应用程序中使用,该应用程序也依赖于WebRTC。这在构建时导致了大量符号冲突,因此我在动态库中添加了一个导出符号文件

现在动态库和Swift应用程序都构建得很好,但是当Swift应用程序启动时,我收到了很多关于重复ObjC类符号的控制台警告:

objc[63026]:类RTCCVPixelBuffer在/path/to/the/dynamic/framework/binary和/path/to/existing/webrtc/in/the/swift/app中实现。将使用其中一个。哪一个未定义。

我检查了我的动态框架,这些WebRTC ObjC符号都是本地(非外部)符号。现在我有两个问题:

  • 本地符号冲突是否会导致任何运行时问题,如未定义的应用程序行为和应用程序崩溃?我知道重复的全局符号不起作用,但使用重复的本地符号最糟糕的结果是什么
  • 这些本地符号是必需的吗?我如何删除它们?我首先尝试通过在构建设置中设置
    生成主对象文件
    条带样式
    部署后处理
    来预链接静态库中的对象文件,希望在进入动态库之前解决所有符号,但我仍然可以在动态库二进制文件中看到这些本地ObjC类符号。我还尝试在
    附加剥离标志
    中设置
    -R
    选项以剥离本地符号,但也失败了。由于ObjC消息发送依赖于这些符号,因此是否需要这些符号且无法删除?解决这种符号冲突问题的正确方法是什么

  • 最后,我使用为所有ObjC接口添加前缀。这实际上是将接口的元数据名称更改为指定的字符串参数,从而解决了重复符号问题。

    最后,我使用。这实际上将接口的元数据名称更改为指定的字符串参数,从而解决了重复符号问题。

    可能是生成静态库,而不是?@Cy-4AH我实际上通过将库从静态更改为动态并添加导出符号文件来解决了生成时符号冲突。另外,保持它的动态性还有其他一些好处(小得多的工件等),所以我宁愿在动态框架中有一个解决方案,除非这是不可能的。静态框架更好。出了点问题,当所有库和框架都是静态的时,没有符号冲突。我不知道你们在谈论哪些较小的工件,但当你们使用静态库时,应用程序实际上更小,因为未使用的对象文件未与应用程序链接。可能是生成静态库吗?@Cy-4AH我实际上通过将库从静态更改为动态并添加导出符号文件解决了生成时符号冲突。另外,保持它的动态性还有其他一些好处(小得多的工件等),所以我宁愿在动态框架中有一个解决方案,除非这是不可能的。静态框架更好。出了点问题,当所有库和框架都是静态的时,没有符号冲突。我不知道你们在谈论哪些较小的工件,但当你们使用静态库时,应用程序实际上更小,因为未使用的对象文件不会与应用程序链接。但你们仍然有双复制符号,只是名称不同。但你们仍然有双复制符号,只是名称不同。