c - 操作系统 : Unable to resolve dependency using dlopen()

标签 c macos dlopen

我在 OSX 上有一个库 libni,我正在尝试使用 dlopen() 打开它,但它似乎无法解决对另一个 dlopen() 库的依赖关系。

我们先不谈为什么不应该使用 dlopen();可以说,我必须在这种情况下使用它。

无论如何,这是 libni.dylib 上的 otool -L:

lib/libni.dylib:
  libni.dylib (compatibility version 0.0.0, current version 0.0.0)
  libn.dylib (compatibility version 0.0.0, current version 0.0.0)
  /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0)
  libzlib.dylib (compatibility version 0.0.0, current version 0.0.0)
  libpng.dylib (compatibility version 0.0.0, current version 0.0.0)
  liblua.dylib (compatibility version 0.0.0, current version 0.0.0)
  libSDL2.0.dylib (compatibility version 0.0.0, current version 2.0.0)
  libstb.dylib (compatibility version 0.0.0, current version 0.0.0)
  libax.dylib (compatibility version 0.0.0, current version 0.0.0)
  libsqlite3.dylib (compatibility version 0.0.0, current version 0.0.0)
  libfreetype.dylib (compatibility version 0.0.0, current version 0.0.0)
  /usr/lib/libiconv.2.dylib (compatibility version 7.0.0, current version 7.0.0)
  /System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa (compatibility version 1.0.0, current version 19.0.0)
  /System/Library/Frameworks/IOKit.framework/Versions/A/IOKit (compatibility version 1.0.0, current version 275.0.0)
  /System/Library/Frameworks/ForceFeedback.framework/Versions/A/ForceFeedback (compatibility version 1.0.0, current version 1.0.2)
  /System/Library/Frameworks/Carbon.framework/Versions/A/Carbon (compatibility version 2.0.0, current version 155.0.0)
  /System/Library/Frameworks/CoreAudio.framework/Versions/A/CoreAudio (compatibility version 1.0.0, current version 1.0.0)
  /System/Library/Frameworks/AudioUnit.framework/Versions/A/AudioUnit (compatibility version 1.0.0, current version 1.0.0)

这是在 libn、zlib 和 png 上:

libn.dylib:
  libn.dylib (compatibility version 0.0.0, current version 0.0.0)
  /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0)

libpng.dylib:
  libpng.dylib (compatibility version 0.0.0, current version 0.0.0)
  libzlib.dylib (compatibility version 0.0.0, current version 0.0.0)
  /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0)

libzlib.dylib:
  libzlib.dylib (compatibility version 0.0.0, current version 0.0.0)
  /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0)

现在我使用 dlopen() 按顺序打开我的“lib”目录中的所有动态库,使用:

/** Open a dynamic library file */
void *Type__(open) (char *path) {
  void *impl = dlopen(path, RTLD_NOW | RTLD_GLOBAL);
  if (impl == NULL) {
    char *err = dlerror();
    N_LOG(N_LOG_DEBUG, "Failed to open: %s", err);
  }
  else {
    N_LOG(N_LOG_DEBUG, "Happy open: %s", path);
    rtn = nPosixLinker__Lib(path, impl);
  }
  return rtn;
}

...并得到这样的错误/消息:

Happy open: /Users/doug/projects/libni/build/tests/IImageLoader/lib/libzlib.dylib
Happy open: /Users/doug/projects/libni/build/tests/IImageLoader/lib/libstb.dylib
Happy open: /Users/doug/projects/libni/build/tests/IImageLoader/lib/libsqlite3.dylib
Happy open: /Users/doug/projects/libni/build/tests/IImageLoader/lib/libSDL2.dylib
Happy open: /Users/doug/projects/libni/build/tests/IImageLoader/lib/libn.dylib
Failed to open: dlopen(/Users/doug/projects/libni/build/tests/IImageLoader/lib/libpng.dylib, 10): Library not loaded: libzlib.dylib
  Referenced from: /Users/doug/projects/libni/build/tests/IImageLoader/lib/libpng.dylib
  Reason: image not found
Failed to open: dlopen(/Users/doug/projects/libni/build/tests/IImageLoader/lib/libni.dylib, 10): Library not loaded: libn.dylib
  Referenced from: /Users/doug/projects/libni/build/tests/IImageLoader/lib/libni.dylib
  Reason: image not found
Happy open: /Users/doug/projects/libni/build/tests/IImageLoader/lib/liblua.dylib
Happy open: /Users/doug/projects/libni/build/tests/IImageLoader/lib/libfreetype.dylib
Happy open: /Users/doug/projects/libni/build/tests/IImageLoader/lib/libax.dylib
Failed to open: dlopen(/Users/doug/projects/libni/build/tests/IImageLoader/lib/libtest-ni-IImageLoader__.dylib, 10): Library not loaded: libni.dylib
  Referenced from: /Users/doug/projects/libni/build/tests/IImageLoader/lib/libtest-ni-IImageLoader__.dylib
  Reason: image not found

所以这里肯定发生了一些奇怪的事情。 zlib 在 libpng 之前打开,但 libpng 无法解析引用。 libn 在 libni 之前打开,但 libni 无法解析引用。

这就像我的 RTLD_GLOBAL 被 dlopen() 忽略了,或者依赖项(例如 libn)没有找到加载的库(blah/libn.dylib),因为路径不同......

事实上,我似乎无法让 dlopen() 打开一个完全有依赖性的库,所以我想我一定是做错了什么。

有什么建议吗?

在 BSD 和 Linux 上这一切都可以正常工作;这绝对是一个与 OSX 处理这些库的方式密切相关的问题。

最佳答案

看起来这是 this 的副本,但直到我找到解决方案后我才完全找到它,所以我暂时将问题和此链接都留在此处。

排序答案:使用 -install_name @rpath/lib 构建库

关于c - 操作系统 : Unable to resolve dependency using dlopen(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13618610/

相关文章:

c - 在 C 头文件中声明指针数组并赋值?

c++ - 我可以在扩展 Python 的同时使用 C++ 功能吗?

macos - jmeter 未在 mac osx 中使用brew 下载

java - dlopen:无法使用静态 TLS 加载更多对象

c - 我怎样才能用C制作一个随机字符串?

c - PC 寄存器显示高于最后指令编号的值

objective-c - 如何为沙盒 Mac 应用程序编写 Growl.framework

objective-c - 强制退出 OS X 应用程序

c++ - 从 C++ 中的动态库访问静态类成员

linux - 库大小如何影响应用程序的加载时间和内存占用量?