7

通过使用温和的 hack,可以为 iOS制作静态框架。静态框架使用起来非常方便:它们可以简单地放入新项目中而无需额外步骤(例如将它们添加到构建中并添加标题搜索路径)。

我最近开始做 OS X 编程,我注意到的第一件事是静态框架似乎不可用。动态框架显然是可用和推荐的,但由于我想制作一个供应用程序使用(而不是安装在/Library/Frameworks)的私有框架,在新的应用程序项目中使用动态框架仍然需要一堆额外的步骤

在我的理想世界中,我会创建一个静态框架(一个包含头文件和编译.a文件的框架),将框架拖放到一个新项目中,然后开始编码。有没有办法在 OS X 上制作这样一个静态框架?

PS 我已经尝试在一个普通的框架项目中将 Mach-O 输出类型设置为“静态库”,但我只是得到了错误Framework target has invalid MACH_O_TYPE value of 'staticlib'.

4

2 回答 2

2

您可以在 Mac OS X 上创建一个动态框架。在您的动态框架中,您可以将 LD_DYLIB_INSTALL_NAME 设置为 @rpath/Foo.framework/Versions/A/Foo

如果您有一个想要与此框架链接的应用程序,那么请确保您运行

  install_name_tool -add_rpath <rpath> <full-path-to-app-binary>

所以如果我有 Foo.app

  install_name_tool -add_rpath Foo.app/Contents/Library Foo.app/Contents/MacOS/Foo 

现在,如果您只是将 Foo.framework 复制到 Contents/Library 中,它应该会被加载并且一切正常。

我希望这有帮助。

可能更简单的是使用带有公共标头的静态库。当您构建静态库时,您可以让 Xcode 自动为您复制标头。在您的目标中,您可以将该文件夹添加到您的搜索路径中。

如果你使用静态库,Xcode 会去掉一些你的应用程序并不真正需要但被编译到静态库中的死代码。

于 2014-12-18T07:45:41.540 回答
1

OS X 上并不真正支持静态框架。无论如何它们都相当脆弱,并且解决了 iOS 上存在但 OS X 上不存在的特定问题。

如果您希望开发人员可以轻松地使用您创建的库,您有几个选择:

  1. 使用Cocoapods。他们有一个在 CocoaPods 上发布你的库的教程。这可能是在 OS X 上分发库的最简单方法。
  2. 将您的库打包为框架。如果您正确设置安装名称(为@rpath/<library name>),下游开发人员只需将框架复制到他们的 Xcode 项目中并将其应用程序的运行时搜索路径设置为@executable_path/../Frameworks)。
于 2014-12-15T21:29:54.757 回答