Environment variables 使用setenv然后进行dlopen调用时出现问题

Environment variables 使用setenv然后进行dlopen调用时出现问题,environment-variables,dlopen,dyld,setenv,Environment Variables,Dlopen,Dyld,Setenv,我正在使用setenv设置DYLD_LIBRARY_PATH,因此当我执行dlopen()时,它将有正确的路径来查找我的.dylib,但是当我执行dlopen()时,它似乎没有搜索我添加到DYLD_LIBRARY_PATH的路径 从我所能收集到的数据来看,我对DYLD_库所做的更改在重新执行我的流程之前不会生效。这是正确的吗 此外,如果这是正确的,是否有一种方法可以设置DYLD_LIBRARY_路径,并在不重置进程的情况下使更改生效 哦,是的,我在MacOSX上写这段代码 提前感谢。我不知道Ma

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

从我所能收集到的数据来看,我对DYLD_库所做的更改在重新执行我的流程之前不会生效。这是正确的吗

此外,如果这是正确的,是否有一种方法可以设置DYLD_LIBRARY_路径,并在不重置进程的情况下使更改生效

哦,是的,我在MacOSX上写这段代码


提前感谢。

我不知道Mac OS,但在Linux上,加载程序读取
getenv(“LD\u LIBRARY\u PATH”)
一次值,并在可执行文件的第一条指令运行之前将其保存。程序对
LD\u LIBRARY\u PATH
的后续修改只会影响其
execve()
s中的任何子进程,而不会影响进程本身。我想在Mac OS上也是如此

通常的解决方法是重新执行进程(Java执行),或者使用一个shell包装器来设置环境,然后执行真正的二进制文件(Firefox执行)


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

我的问题的答案是不,如果不在LD_LIBRARY_路径上重新执行进程,环境变量就不能使用setenv来影响dlopen


我发现你应该使用@execuable\u path、@loader\u path或@rpath作为我的.dylb上的安装名路径。这样,你可以从dlopen对你的.dylibs进行相对路径搜索。

目前,我们的软件执行了重新执行,用我们的额外路径设置LD\u库路径。我试图在不重新执行的情况下做到这一点,但这可能是MAC操作系统上的唯一方法。这使得调试变得更加困难,因为Xcode调试在第一次执行和第二次执行之间被中断。如果现有的LD_LIBRARY_路径不正确,Java会重新执行。您的程序必须执行相同的操作,否则它将进入无限循环。因此,要调试它,请将LD_LIBRARY_PATH设置为在重新执行之前(可能在启动Xcode之前)应该设置的路径,然后进行调试。