Macos 如何让Mac OS应用程序找到私有动态库?
对于Mac OS X,我已经手动创建了一个应用程序目录Macos 如何让Mac OS应用程序找到私有动态库?,macos,Macos,对于Mac OS X,我已经手动创建了一个应用程序目录foo.app/,其中包含以下文件: Info.plist Contents/MacOs/foo Frameworks/libbar.dylib 文件 Foo是可执行的,并使用MaCfile文件从C++编译。文件libbar.dylib使用 install_name_tool -id @rpath/libbar.dylib libbar.dylib 当我从Finder启动应用程序时,我得到: Dyld Error Message: L
foo.app/
,其中包含以下文件:
Info.plist
Contents/MacOs/foo
Frameworks/libbar.dylib
文件<代码> Foo是可执行的,并使用MaCfile文件从C++编译。文件
libbar.dylib
使用
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
。解决此问题的最佳方法是什么?一种非常简单的方法是将Contents/MacOs/foo重命名为foo2,并在同一目录中创建一个新文件foo,其基本内容如下:
./foo2 —-load-lib /path/to/lib
但为了实现这一点,应用程序必须支持这种功能。[在JWWalker的回答启发了我之后更新。] 工具
install\u name\u工具
提供了一个解决方案:使用它将@loader\u path/./Frameworks
添加到foo
的rpath中,如下所示:
$ cd foo.app/Contents/MacOS
$ install_name_tool -add_rpath @loader_path/../Frameworks foo
当你链接你的
foo
工具时,你需要告诉它@rpath
的意思。当我查看由Xcode项目生成的命令行时,我看到了提供给clang++的选项:
-Xlinker -rpath -Xlinker "@loader_path/../Frameworks"
这假设框架是内容的子文件夹(通常是),而不是您所指出的兄弟文件夹。谢谢!我的goof没有在当前目录设置为MacOS/以外的情况下进行测试。我已经更新了我的答案。