环境变量——使用setenv然后进行dloopen调用的问题



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

从我可以收集到的信息来看,我对DYLD_LIBRARY_PATH的更改在重新执行我的进程之前不会生效。这是正确的吗?

如果这是正确的,是否有一种方法可以设置DYLD_LIBRARY_PATH并使我的更改工作而不需要重置我的进程?

哦,是的,我在MAC OSX上写这段代码。

我不知道Mac OS,但在Linux上,加载器读取getenv("LD_LIBRARY_PATH") 的值一次,并保存它,早在可执行文件的第一条指令运行之前。程序对LD_LIBRARY_PATH的后续修改只影响execve() s的任何子进程,而不影响进程本身。我想这在Mac OS上也是类似的。

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

可能有一个Mac OS特定的方式来更新图书馆搜索路径,尽管谷歌似乎没有找到任何匹配。我很确定Linux上没有这样的机制

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

我发现你应该使用@exectuable_path, @loader_path或@rpath作为我的。dylb的安装名路径,这样你就可以从dlopen在你的。dylibs上做一个相对路径搜索。

最新更新