我使用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上做一个相对路径搜索。