使用setenv然后进行dlopen调用的问题

Mic*_*uth 5 environment-variables dyld dlopen setenv

我正在使用setenv设置DYLD_LIBRARY_PATH,所以当我执行dlopen()时,它将有正确的路径来查找我的.dylib,但是当我执行dlopen()时,它似乎不会搜索我添加到DYLD_LIBRARY_PATH的路径.

从我可以收集的内容中,我对DYLD_LIBRARY_PATH的更改在重新执行我的进程之前不会生效.它是否正确?

此外,如果这是正确的,是有办法来设置DYLD_LIBRARY_PATH和有我的变化与出当仁不让过程的复位工作.

哦,是的,我在MAC OSX上编写了这段代码.

提前致谢.

Emp*_*ian 5

我不了解 Mac OS,但在 Linux 上,加载程序会在可执行文件的第一条指令运行之前很久就读取getenv("LD_LIBRARY_PATH") Once的值并将其保存起来。LD_LIBRARY_PATH程序的后续修改仅影响其子execve()进程,但不会影响进程本身。我想 Mac 操作系统上也是类似的。

解决这个问题的通常方法是重新execve处理(Java 就是这样做的),或者使用 shell 包装器来设置环境,然后执行真正的二进制文件(Firefox 就是这样做的)。

可能有 Mac OS 特定的方法来更新库搜索路径,尽管 Google 似乎没有找到任何匹配项。我很确定Linux 上没有任何这样的机制。


Mic*_*uth 2

我的问题的答案是否定的,如果不重新执行 LD_LIBRARY_PATH 上的进程以使环境变量对 dlopen 生效,则无法使用 setenv。

我发现您应该使用 @exectuable_path、@loader_path 或 @rpath 作为我的 .dylb 上的安装名称路径,这样您就可以从 dlopen 对 .dylibs 进行相对路径搜索。