为OS X创建静态框架

7
通过使用一个轻微的hack,可以为iOS制作静态框架。静态框架非常方便使用:它们可以直接放入新项目中,无需额外步骤(如将其添加到构建中并添加头文件搜索路径)。
我最近开始进行OS X编程,我注意到的第一件事是似乎没有静态框架可用。动态框架显然是可用和推荐的,但由于我想制作一个专门用于应用程序使用(而不是安装在/Library/Frameworks中)的小型私有框架,在新的应用程序项目中使用动态框架仍然需要大量额外步骤
在我的理想世界中,我会创建一个静态框架(包含头文件和已编译的.a文件的框架),将框架拖放到新项目中,并开始编码。在OS X上有没有制作这样的静态框架的方法?

附言:我已经尝试在普通框架项目中将Mach-O输出类型设置为"静态库",但是我仍然收到错误消息框架目标具有无效的MACH_O_TYPE值"staticlib"。


静态库在OS X上并不是真正存在的东西。它们只在iOS上使用,因为在签名应用程序中动态加载很困难(甚至可能不可能?)。请按照您链接的说明使用动态框架。 - user149341
2
“静态库在OS X上并不是真正的存在。”这并不是真的。 - Billy Gray
为什么不只建立一个静态库? - mipadi
@nneonneo:静态库在编译时被链接到可执行文件中,因此无需安装库或将其与应用程序打包。 - mipadi
@mipadi:这是为了让开发人员更容易地集成该库。 - nneonneo
显示剩余6条评论
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将剥离掉一些您的应用程序实际上不需要但已编译到静态库中的死代码。

“你可以让Xcode自动为你复制头文件。” 这听起来非常接近我想要的。 我该怎么做呢? 我可以让Xcode将它们复制到系统目录中吗? - nneonneo
你可以让Xcode将头文件复制到构建文件夹中。如果我没错的话,你的构建目录是头文件搜索路径的一部分。 - dimitrirostavo

1

静态框架在OS X上并不受支持。它们非常易碎,解决了iOS上存在但在OS X上不存在的特定问题。

如果您希望方便开发人员使用您创建的库,则有几个选项:

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

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