Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 如何让Mac OS应用程序找到私有动态库?_Macos - Fatal编程技术网

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

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

对于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:
  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/以外的情况下进行测试。我已经更新了我的答案。