关于xcode:OSX:更改.framework的路径

OSX: changing path of .framework

我的Mac OS应用程序与非系统提供的框架Foo.framework链接。 我在XCode中添加了对该框架的引用,并且该应用程序构建良好。 我也有一条将框架复制到输出Frameworks文件夹(MyApp.app/Contents/Frameworks)的规则。 但是,在运行时,二进制文件正在?/ Library / Frameworks中寻找框架,并且该应用程序无法加载。

otool -l MyApp.app也告诉我,它正在/ Users // Library / Frameworks中寻找框架。

有人可以解释为什么会这样吗,以及使应用程序在应用程序包的Frameworks文件夹中显示的正确方法是什么?

我棘手的解决方法是包括一个自定义脚本,以使用install_name_tool更改mach-o二进制文件中的路径,但是我敢肯定有一种干净的方法。


您走在正确的轨道上。

这是因为在OS X上创建"install_name"时将其记录在库中。然后将该install_name复制到与其链接的任何应用程序。

解决问题的"最佳"方法是修改框架的源代码,以便在构建框架时设置-install_name链接器标志。

但是,这通常是不可能的,要么是因为您没有源,要么是框架中有大量的autoconf东西,几乎使它不可能。在这种情况下,请使用带有-id标志的install_name_tool来更改库中记录的install_name

那么,话虽这么说,您将其更改为什么?

@executable_path /../ Frameworks / Foo.framework / Foo(或其他名称)

因此,从包含Foo.framework的目录中:

1
install_name_tool -id @executable_path/../Frameworks/Foo.framework/Foo Foo.framework/Foo

在运行时,加载程序会将@executable_path解析为应用程序可执行文件的路径。显然,您还需要设置一个"复制文件"构建阶段,以将框架复制到应用程序捆绑包的Framework文件夹中。

您还可以将install_name_tool与-change标志一起使用,以在将库的install_name链接到应用程序后对其进行更改,但这显然不是最佳选择。链接之前对其进行修复。