如何让Mac OS应用程序找到私有动态库?

时间:2015-11-24 23:57:52

标签: macos

对于Mac OS X,我手动创建了一个包含以下文件的应用程序目录foo.app/

Info.plist
Contents/MacOs/foo
Frameworks/libbar.dylib

文件foo是起始可执行文件,是使用Makefile从C ++编译的。文件libbar.dylib的ID设置为;

install_name_tool -id @rpath/libbar.dylib libbar.dylib

当我从Finder启动应用程序时,我得到:

Dyld Error Message:
  Library not loaded: @rpath/libbar.dylib
  Referenced from: /private/tmp/foo.app/Contents/MacOS/foo
  Reason: image not found

显然,我需要在捆绑中添加一些东西来告诉加载器在哪里找到libbar.dylib。解决问题的最佳方法是什么?

3 个答案:

答案 0 :(得分:0)

一种非常天真的方法是将Contents / MacOs / foo重命名为foo2并在同一目录中创建一个新文件foo,其基本上是:

ORDER BY

但为了实现这一点,应用必须支持这种功能。

答案 1 :(得分:0)

[在JWWalker的答案启发后我更新了。]

工具install_name_tool提供了一个解决方案:使用它将@loader_path/../Frameworks添加到foo的rpath中,如下所示:

$ cd foo.app/Contents/MacOS
$ install_name_tool -add_rpath @loader_path/../Frameworks foo

答案 2 :(得分:0)

当您关联foo工具时,您需要告诉它@rpath的含义。当我查看由Xcode项目生成的命令行时,我会看到提供给clang ++的选项:

-Xlinker -rpath -Xlinker "@loader_path/../Frameworks"

这假定Frameworks是内容的子文件夹,通常不是您所指示的兄弟。