【问题标题】:Module redefinition while linking static libs in two dependent frameworks在两个依赖框架中链接静态库时重新定义模块
【发布时间】:2019-10-04 16:17:38
【问题描述】:

我正在处理的 Swift 项目具有以下结构

   STATIC lib --- STATIC lib

        |            |

    FRAMEWORKA  FRAMEWORKB  

             \   /

              App

框架 A 和 B 将第 3 方静态库与一些标头集成在一起,我在框架 A 和 B 中编写了自定义模块映射

另一方面,应用嵌入了FRAMEWORK A & B,自然会出现模块重定义错误

我有几种方法可以解决这个问题

1:通过弱链接(定义 .a)可选,而不是 FramworkB 项目中的必需(尽管我听说该功能不适合这种黑客攻击)

2:在框架 A 和 B 中以不同的方式命名 Objective-c 模块,这样它会欺骗链接器成功运行应用程序,但我在运行时在控制台日志中收到此消息

在 框架

module ACore {
    header "ACoreConstants.h"
}

在框架B中

module Acorn {
    header "ACoreConstants.h"
}

ACore 类在两者中都实现 /Users/user/Library/Developer/Xcode/DerivedData/TesterApp-anudhiavmakfclfdxilmgmfzordl/Build/Products/Debug-iphonesimulator/FrameworkA.framework/FrameworkA (0x108ad2908) 和 /Users/user/Library/Developer/Xcode/DerivedData/TesterApp-anudhiavmakfclfdxilmgmfzordl/Build/Products/Debug-iphonesimulator/FrameworkB.framework/FrameworkB (0x10881d908)。将使用两者之一。哪一个是未定义的。

有没有更好的、更清洁的方法来做这种事情?

【问题讨论】:

    标签: ios objective-c swift linker frameworks


    【解决方案1】:

    所以经过一番挣扎后,我将架构演变为更简单的架构

         STATIC lib
               |
       Wrapper Framework
        /            \
    FRAMEWORKA  FRAMEWORKB  
             \   /
              App
    

    这样,FRAMEWORKA & B 通过外观与包装器框架对话,包装器框架永远不必泄漏有关包含的静态库的信息

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-06
      • 1970-01-01
      • 1970-01-01
      • 2011-06-11
      • 2011-12-12
      相关资源
      最近更新 更多