【问题标题】:app compiles and works with no frameworks应用程序无需框架即可编译和工作
【发布时间】:2013-11-10 04:25:36
【问题描述】:

所以我有一个大项目(我们称它为 A),而应用 B 的一些人想将我的应用的一部分放入他们的应用中,所以我创建了一个框架以添加到他们的应用中。创建它的步骤是清理我的应用程序的代码,只留下与他们想要的内容相关的内容,从中创建一个框架,创建一个使用框架进行调试并查看一切正常的示例应用程序。到目前为止,就框架而言,我所做的只是将我的应用程序 (A) 中的所有框架添加到我的示例应用程序中。

现在我要清理框架和示例应用程序中的东西和剩余部分,然后再将其发送给 B 应用程序人员。所以我开始从我的示例应用程序中一个一个地删除框架,每次在我的设备上构建和运行,每次一切都很完美。我每隔 2-3 个框架停下来进行深度构建清理,并从我的 iphone 中删除了该应用程序,但一切正常。我最终删除了我在我的一个应用程序框架类中专门导入的特定框架,仍然有效。我最后的手段是删除 UIKit 和 Foundation 框架。仍然可以完美运行。我做了深度清理,从我的 iPhone 上卸载,删除了 DerivedData 文件夹的内容,然后重新启动了计算机,一切仍然可以编译、构建和工作。 我开始遇到的唯一问题是我的 Localytics 会话向 NSLogs 显示 AdSupport 框架丢失并且可能会损害跟踪......仍然没有崩溃。

据我所知,我正在编译我的 A 应用程序的框架,其中没有任何框架(甚至可以在框架内编译框架吗?)。我的框架是用这个很棒的 git 构建的:iOS Universal Framework Mk 8(我正在创建一个真正的框架而不是假的)。

我基本上关心这一切,因为我确实想检查哪些框架是无用的并且可以删除,而我的项目太大而无法检查是否以及谁在使用任何框架。

我正在使用Xcode 5.0.1, ios7 SDK, iphone5c。 我确实确保我删除的所有框架都没有留在Link binary with Libraries 部分...

这些是我从示例应用项目中删除的框架: CoreGraphicsCFNetworkSystemConfigurationMobileCoreServicesQuartzCoreCoreDataStoreKitAdSupport(AVFoundationCoreText987654333CoreText79 @Foundation

感谢任何帮助或想法(:

【问题讨论】:

  • 在构建设置/搜索补丁部分检查您的库的包含路径
  • 我想,既然您正在创建一个库 (.so) 而不是一个完整的二进制文件,那么您实际上并没有进入链接阶段。在完整程序中使用您的库的任何人都需要链接到您的代码所需的所有库。

标签: ios iphone objective-c xcode frameworks


【解决方案1】:

我知道这个帖子有点老了,但我也遇到了同样的问题,并认为我的回答可以帮助其他人。

不知何故,我使用的 TestFlight 库中包含所有必需的符号。从我的链接步骤中删除 libTestflight.a 迫使我再次链接 UIKit/CoreGraphics。

【讨论】:

    【解决方案2】:

    使用 C 从代码到二进制的过程是一个多步骤的过程。预处理、编译、链接、加载。

    1. 源 (.c/.m) 被预处理为 .i 文件(删除 cmets、评估宏等)。
    2. 预处理代码 (.i) 被词法分析、解析并编译成程序集 (.s)。
    3. 程序集 (.s) 被编译为对象或库文件 (.o/.so/.a) 中的机器代码。
    4. 对象文件 (.o/.a) 链接到单个二进制文件中。
    5. 在运行时,系统会确定可执行文件需要哪些共享库 (.so) 并加载它们。

    在构建库时,编译会在第 3 步之后停止,因此您实际上不需要库二进制文件,只需要头文件来声明函数(以及任何类型定义、结构、宏等) .)。但是,使用您的库的人将经历第 4 步和第 5 步,因此需要库二进制文件。

    【讨论】:

    • 我不确定我是否在关注你... 创建框架后,我从头开始创建了一个使用该框架的新项目。然后我从那个示例项目中删除了我在 Q 中提到的所有那些框架,并且一切仍然有效(除了 .dylib 而不是 .framework => libz.dylib, libsqlite3.dylib 的源:这两个确实导致了构建错误)。为什么将我的框架添加到现有应用程序而不是创建新项目并添加我的框架的客户(B 应用程序人员)会有所不同?
    • 如果您有一个空应用程序,则该应用程序没有使用您库中的任何调用,因此链接器可能甚至没有链接它。尝试添加对您的库函数之一的调用,最好是需要您删除的库的调用。
    • 该应用程序现在不是空的,我从头开始创建了一个示例应用程序,它使用所有库方法来确保它们都能正常工作,我还调用并打开了肯定使用我的库的屏幕已删除。此外,即使没有我构建的框架,应用程序本身也会在其 .pch 中导入 Foundation.frameworkUIKit.framework,而项目中不存在这些的事实似乎并不在意......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-19
    • 1970-01-01
    • 2011-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多