4

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

窗户解决方案:

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

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

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

还有其他想法吗?

4

2 回答 2

0

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

于 2017-02-03T04:29:58.860 回答
-2

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

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

您还可以查看 NSAddImage(),它是 OSX 特定的,但也应该做您想做的事情。

于 2012-12-16T20:42:49.743 回答