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

时间:2012-11-28 11:25:28

标签: macos dll linker shared-libraries

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

Windows解决方案:

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

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

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

还有其他想法吗?

2 个答案:

答案 0 :(得分:0)

编写一个在运行时发现路径的包装器脚本或可执行文件,将路径添加到DYLD_LIBRARY_PATH,然后将execve调用到真正的可执行文件。

答案 1 :(得分:-1)

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

dlopen()等的优点是相同(或类似)的代码可用于其他* nix&#39。

您还可以查看NSAddImage(),这是OSX特定的,但也应该做你想要的。