【问题标题】:dlopen() error image not founddlopen() 找不到错误图像
【发布时间】:2011-07-15 18:58:43
【问题描述】:

我有软件首先加载 .dylib 让我们使用以下命令调用 libFirst.dylib:

void* handle = dlopen(path.c_str(), RTLD_LAZY | RTLD_GLOBAL);

稍后在加载的 libFirst.dylib 的函数内部,我尝试使用相同的命令加载另一个 .dylib,但对于 libSecond.dylib,加载此共享库会在我的 Xcode 控制台中显示以下警告:

error warning: Ignored unknown object module at 0x129310 with type 0x8a8399

dlerror: dlopen(/path/libSecond.dylib, 9): Library not loaded: libFirst.dylib
  Referenced from: /path/libSecond.dylib
  Reason: image not found

我不明白的是它说 libFirst.dylib 没有加载,但我目前在 libFirst.dylib 的一个函数中,所以这怎么可能?

我在 DYLD_LIBRARY_PATH 中的所有路径也都显示正确。

提前感谢,我已经坚持了好几天了。

【问题讨论】:

  • 你尝试过类似 strace 的东西吗?它可能会为您提供更多信息,以便具体查看哪个呼叫失败。
  • 我的堆栈跟踪显示了在 libSecond.dylib 上调用 dlopen 的名为 CreateModule 的函数,它是 libFirst.dylib 中的一个函数。
  • 不是堆栈跟踪 - strace 代表系统跟踪。它跟踪函数调用,如打开文件、统计 inode 等。它可能会揭示您的操作系统的确切位置。
  • 我必须使用 dtruss,因为我在 OSX 上,但这是在 libSecond.dylib 上打开后发生的情况:stat64("libFirst.dylib\0", 0xBFFFE0FC, 0x1)= - 1 Err#2 stat64("/Users/mwildermuth/lib/libFirst.dylib\0", 0xBFFFE4DC, 0x1) = -1 Err#2 tat64("/usr/local/lib/libFirst.dylib\0", 0xBFFFE4DC, 0x1) = -1 Err#2 stat64("/usr/lib/libFirst.dylib\0", 0xBFFFE4EC, 0x1)= -1 Err#2 然后我从上面的问题中得到了我通常的错误。 stat64 调用中的所有位置都不正确,这可能是问题的原因吗?如果是这样,我该如何解决。再次感谢您的宝贵时间。
  • 当然——我亲身知道这有多令人沮丧 :) 是的,看起来只是找错了地方。我对 OSX 的了解不够,无法帮助您解决这个问题,但也许您可以修复一个库搜索路径?

标签: dylib dlopen dynamic-library


【解决方案1】:

我最终使用 -install_name 将我所有库的安装名称更改为 @rpath/dylibName.dylib,然后在 Xcode 中我使用 @loader_path 设置运行路径搜索路径以查找我正在使用的所有 .dylib。

【讨论】:

【解决方案2】:

使用:

install_name_tool -id @executable_path/../Frameworks/mylib.dylib mylib.dylib

然后检查它:

otool -D mylib.dylib

【讨论】:

    【解决方案3】:

    我认为解决此错误的更简单方法是恢复到您没有收到此错误的早期版本。右键单击项目文件夹并导航到本地历史记录以恢复到早期版本。我验证这可以在 Mac OS Big sur 上安装的 android studio 上运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-05
      • 2016-12-03
      • 2016-08-16
      • 2010-11-18
      • 1970-01-01
      • 1970-01-01
      • 2021-02-28
      相关资源
      最近更新 更多