在Xcode项目中将静态库目标转换为框架目标

28

我有一个Xcode项目,可以生成静态库。我的团队计划所有新开发使用Swift语言。无法将Swift文件添加到静态库项目中。我们不再支持iOS 7,因此现在可以在我们的iOS应用程序中包含框架。因此,我打算将我的静态库项目转换为框架项目。

我已经搜索了但找不到任何工具或建议来执行此转换。这个静态库很大(超过100个.m文件)。

我希望得到一个更好的答案,而不是创建一个新的并行框架目标。我尝试了两次。第一次作为Swift目标,但我无法轻松导入所有Objective C文件。接下来,作为Objective C目标,但没有.pch文件了。


我遇到了同样的问题,创建了一个混合 objC + swift 代码的框架。你找到任何解决方案了吗,@Jeffery Thomas? - Nir Golan
1
@LouWeed 不是的,那只是一天的工作。我创建了一个新的Objective C目标,然后重新创建了所有目标设置(包括.pch文件)。 - Jeffery Thomas
1
很棒的问题,非常遗憾听到没有找到非手动解决方案。:( - Dan Rosenstark
2个回答

13

将静态/动态链接框架从静态链接库转换:

  1. 在现有的静态链接库项目中添加一个新的Cocoa Touch框架作为TARGET。
  2. 在“Build Phases”中,将所有.m、.mm、.c、.cpp、.metal等文件添加到您的静态链接框架目标的“\Build Phases\Compile Sources”阶段。
  3. 将要公开的头文件放入“\Build Phases\Headers”中。
  4. 对于动态链接框架,请记住在您的构建设置中检查Mach-O类型设置。如果您要使用Swift,需要确保Mach-O类型设置为动态库,以便它变成动态链接框架。对于静态链接框架,您需要将Mach-O类型设置为静态库,但不能在转换后的静态链接框架中使用Swift(只允许使用Objective-C、Objective-C++、C++、C等)。

然后,对于想使用此框架的应用程序,只需将头文件包含为 #import 并将框架添加到您的应用程序目标的“Build Phases\Link Binary With Libraries”中。如果转换后的框架是动态链接框架,则需要将其放入“Embedded Binaries”中。


一旦我在我的新项目中添加了一个Swift文件,就会出现“不支持静态库的Swift”错误。 - lostintranslation
建议的方法是将“静态链接库”转换为“静态链接框架”。虽然Swift目前不支持静态库,但您不能将Swift直接添加到新创建的“静态”链接框架中。 - joseph
我对你上面的回答@joseph感到困惑,你说“你不能将Swift添加到新创建的“静态”链接框架中。”,那么你的回答中的步骤的目的是什么,如果结果仍然与Swift不兼容?也许你是想说“可以”而不是“不能”?此外,如果这确实适用于Swift,你能提供更详细的步骤吗?我遇到了同样的问题,但似乎无法完全理解上面的步骤(我在iOS开发方面相当新手)。 - Franco
1
你是否知道一种方法,可以将静态库的 Build Phases、Compile Sources 部分中的所有文件复制(是的,使用 Copy 命令),并将它们全部粘贴到框架的 Compile Sources 部分中? - Alex Zavatone
Franco,静态链接库适用于Objective-C或Objective-C++项目。如果您需要添加Swift,则需要将Macho-O类型更改为“动态库”。 - joseph

2
我看到有人手动创建了框架,创建一个module.framework文件并将所有头文件复制到module.framework/Headers文件夹中。这种解决方案似乎有效,项目可以正确导入文件并正确地将其视为框架。
但我不确定这是否是最好的方法。我正在一个大型项目上尝试使用它,该项目目前通过cocoapods导入静态库,但似乎在使用框架时存在一些类的可见性问题。

我可以将其他框架的头文件包含到我的框架中,以便最终用户可以看到我的框架,并从中访问其他框架的类吗? - Saty
你还记得他是如何将它们全部粘贴到框架的编译源代码部分吗?我有几千个文件需要处理。 - Alex Zavatone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接