对于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
。解决问题的最佳方法是什么?
答案 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是内容的子文件夹,通常不是您所指示的兄弟。