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

Macos 延迟(动态)加载Mac上的框架(或动态库),macos,dll,linker,shared-libraries,Macos,Dll,Linker,Shared Libraries,我试图在mac上加载一个框架(或动态库),我只知道运行时的路径 Windows解决方案: 使用/DELAYLOAD链接库 在使用库中的函数之前,将程序中的当前目录更改为dll所在的目录 从这个库中调用一些函数。dll是从当前目录加载的 在mac上,我可以使用弱链接使应用程序在库不可用的情况下启动。但是,只要需要库中的某些函数,我就会得到“image not found”,应用程序就会中止 我如何在运行时告诉Mac dynamic linker在哪里查找库?“dlopen”不起作用,因为它只加

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

Windows解决方案:

  • 使用/DELAYLOAD链接库
  • 在使用库中的函数之前,将程序中的当前目录更改为dll所在的目录
  • 从这个库中调用一些函数。dll是从当前目录加载的
在mac上,我可以使用弱链接使应用程序在库不可用的情况下启动。但是,只要需要库中的某些函数,我就会得到“image not found”,应用程序就会中止

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

还有其他想法吗?

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

dlopen()等的优点是,与其他*nix上的代码相同(或类似)


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

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

如前所述,dlopen和dlsym不是我想要的,因为我必须重写所有代码。对于C++类来说非常麻烦。另外,rpath不起作用,因为我无法在运行时更改它。我不认识NSADIMAGE。它会将符号正确链接到代码中使用的已加载但延迟链接的符号吗?