【发布时间】: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