Mac 上框架(或 dylib)的延迟(动态)加载

Jan*_*egg 5 macos dll linker shared-libraries

我正在尝试在 mac 上加载一个框架(或 dylib),我只在运行时知道路径。

Windows解决方案:

  • 使用 /DELAYLOAD 链接库
  • 在使用库中的函数之前,将程序中的当前目录更改为 dll 所在的目录
  • 从这个库中调用一些函数。从当前目录加载dll

在 Mac 上,我可以使用弱链接在库不可用的情况下启动应用程序。但是,一旦需要库中的某些功能,我就会收到“找不到图像”,并且应用程序将中止。

如何在运行时告诉 Mac 动态链接器去哪里寻找库?“dlopen”不起作用,因为它只加载库而不解析符号。将 rpath 设置为“.” (当前目录)并且更改当前目录不起作用。设置典型环境变量 (DYLD_LIBRARY_PATH) 仅在运行可执行文件之前完成,而不是在运行时完成。

还有其他想法吗?

小智 -2

使用 dlopen() 打开库,然后使用 dlsym() 查找符号。如果您依赖动态链接器,则必须提前知道路径并通过 rpath 或环境变量进行设置。rpath 可以采用相对路径,因此这可能对您有用......但最有可能的是, dlopen() 和朋友是这里最好的解决方案(尽管可能需要一些工作才能转换为使用函数指针)。

dlopen() 等的优点是相同(或相似)的代码可以在其他 *nix 上工作。

您还可以查看 NSAddImage(),它是 OSX 特定的,但也应该执行您想要的操作。