我们正在工作的项目依赖于一个称为“LibraryAlpha”的动态库。此外,我们正在执行的项目依赖于称为“LibraryBeta”的动态库。而且,恰巧碰巧“LibraryBeta”也依赖于“LibraryAlpha”。

我们的项目嵌入了由不同构建的.framework,即嵌入了来自不同.xcodeproj的目标。

在以下情况下,以这种方式或另一种方式将“LibraryAlpha”的符号和实现(功能和类)的机会两次嵌入到我们的项目包中是什么:

  • “LibraryAlpha”的项目目标嵌入到项目的捆绑软件中,“LibraryAlpha”的项目目标嵌入到“LibraryBeta”的捆绑软件中。
  • “LibraryAlpha”的项目目标嵌入到项目包中,“LibraryAlpha”的源代码与“LibraryBeta”的源代码静态链接
  • “LibraryAlpha”的项目目标已嵌入到项目包中,其中“LibraryBeta”仅链接而不嵌入“LibraryAlpha”

  • 此外,通常期望使用SPM生成的.xcodeproj在项目中将依赖项模块作为独立的目标来实现,这些目标模块链接并嵌入到主模块(声明其依赖项)的包中。所以问题是,如果我在我们的项目中链接并嵌入“LibraryAlpha”不是目标“LibraryAlpha”的目标,而是在“LibraryBeta”项目中为“LibraryAlpha”的文件生成了目标,该怎么办?

    最佳答案

    这个问题是错的。其中提出的一些案例无法在现实生活中复制。

    首先,在“一个与链接的框架并在另一个框架中嵌入的框架”问题中提到的概念甚至都不是一回事–实际上,动态链接的整个概念是为了在多个对象之间重用相同的共享对象而提出的。用户,而无需多次提供(读取,嵌入)相同的代码。

    情况1

    牢记先前的陈述,第一个案例实际上无法在现实生活中重现,因为该案例表明

    “LibraryAlpha”的项目目标已嵌入“LibraryBeta”的捆绑软件中。

    “LibraryBeta”可能与“LibraryAlpha”的项目目标链接在一起,为了在运行时使用“LibraryBeta”,可执行文件需要嵌入“LibraryAlpha”。由于“LibraryAlpha”将仅在束中出现一次,因此此处无法实现符号的重复。

    情况二

    “LibraryAlpha”的源代码与“LibraryBeta”的源代码静态链接

    这种情况将导致重复的代码被编译。一旦以动态库“LibraryAlpha”的形式存在于捆绑软件中,并以静态方式链接到“LibraryBeta”。

    警告:

    实际上,在这种情况下,假设您的任何源代码文件都在顶部import LibraryAlpha声明,那么您将完全无法编译“LibraryBeta”。 Swift中的模块不能手动声明,其源代码必须位于单独的目标中才能导入。该案例的源代码与“LibraryBeta”位于同一模块中,因此编译器将使用No such module LibraryAlpha出错。

    情况3

    “LibraryBeta”仅链接而不嵌入“LibraryAlpha”

    实际可行的解决方案不会导致任何代码重复。

    案例4

    ...链接并将“LibraryAlpha”嵌入不是项目“LibraryAlpha”的目标,而是在“LibraryBeta”项目中为“LibraryAlpha”的文件生成了目标

    在这种情况下,不会发生代码重复。

    奖金回合:

    对于第4种情况,除了您蓬勃发展,不要重用目标。

    通过将“LibraryBeta”链接到一个动态库,但嵌入另一个动态库,则有两个结果。
    假设相同的源代码和相同的配置应产生相同的动态库,具有相同目标代码,.swiftmodule,.swiftdoc,dSYM以及所有内容的.framework文件夹,即使这是不同项目中的两个不同目标。因此,万一如果在两个不同的项目中,作为结果的.framework碰巧是绝对相同的2个不同的编译,作为两个不同的目标,那么您的可执行文件,即我们的项目应该链接到运行时出现的任何.framework都很好!

    但是,如果“LibraryAlpha”自身目标的输出与“LibraryBeta”“LibraryAlpha”目标有些不同,那么……模因...我没有费心检查这种情况会发生什么。但是无论哪个“LibraryAlpha”都包含在内的逻辑提示都不会正确链接到相反的目标,并且动态链接会失败。如果有人想亲自检查这种行为,请成为我的客人。

    10-02 21:24