ios - iOS 产品中双重直接代码包含的可能性

标签 ios swift frameworks swift-package-manager xcode-project

我们的项目依赖于一个名为“LibraryAlpha”的动态库。另外,我们的项目工作依赖于一个名为“LibraryBeta”的动态库。而且,恰好“LibraryBeta”也依赖于“LibraryAlpha”。

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

在以下情况下,“LibraryAlpha”的符号和实现(函数和类)以这种或其他方式两次嵌入到我们项目的包中的机会有多大:

  • “LibraryAlpha”的项目目标嵌入到项目的 bundle 中,“LibraryAlpha”的项目目标嵌入到“LibraryBeta”的 bundle 中。
  • “LibraryAlpha”的项目目标嵌入到项目包中,“LibraryAlpha”的源代码与“LibraryBeta”的源代码静态链接
  • “LibraryAlpha”的项目目标嵌入到项目包中,“LibraryBeta”仅链接到“LibraryAlpha”,而不嵌入“LibraryAlpha”

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

最佳答案

问题是错误的。其中有些案例在现实生活中无法重现。

首先,问题中提到的“一个框架链接并嵌入另一个框架”的概念根本就不是一个东西——事实上,动态链接的整个概念是在追求在多个用户之间重用相同的共享对象,而不需要多次使用相同的代码(读取、嵌入)。

案例1

记住前面的陈述,第一个案例实际上不可能在现实生活中立即重现,因为该案例指出

"LibraryAlpha"'s project target embedded into "LibraryBeta"'s bundle.

“LibraryBeta”可能与“LibraryAlpha”的项目目标链接,为了在运行时使用“LibraryBeta”,可执行文件需要嵌入“LibraryAlpha”。符号的重复在这里是无法实现的,因为“LibraryAlpha”只会在 bundle 中出现一次。

案例2

"LibraryAlpha"'s source code statically linked with the source code of "LibraryBeta"

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

警告:

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

案例3

"LibraryBeta" only linking against, without embedding, "LibraryAlpha"

实际工作的解决方案,不会导致任何代码重复。

案例4

...link and embed "LibraryAlpha" not as a target from a project "LibraryAlpha", but that one generated target for "LibraryAlpha"'s files in the project of "LibraryBeta"

这种情况下不会出现代码重复。

奖金轮:

对于像第四种这样的情况,除非你不重用目标。

通过将“LibraryBeta”链接到一个动态库,但嵌入另一个动态库...有两种结果。 假设相同的源代码和相同的配置应该生成相同的动态库、具有相同目标代码的相同 .framework 文件夹、.swiftmodule、.swiftdoc、dSYM 等,即使它是不同项目中的两个不同目标。因此,如果生成的 .framework 恰好是 2 个不同项目中的 2 个不同目标完全相同的 2 个不同编译,那么您的可执行文件(即我们的项目)应该链接到运行时存在的任何 .framework!

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

关于ios - iOS 产品中双重直接代码包含的可能性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49085449/

相关文章:

ios - 从数据库中检索数据后重新加载 UiTableView - Swift

ios - 添加将包含输入的 UIView

ios - 不从缓存中获取对象 - 解析

javascript - v-on :click event Vue. js 显示用户帖子

ios - 是否需要为 iCloud Drive 更新 iOS 7 iCloud 应用程序?

ios - 如何让这个 segue 动画退出到右侧或左侧? - swift

iOS 应用向右移动,无法查看完整表格

ios - 当我通过 OpenGLES 自定义 imageView 时出了什么问题?

objective-c - 如何为 iOS 应用程序创建 objective-C 框架

iphone - Xcode:在现有项目中找不到库文件,它应该在哪里?