运行时更改LD_LIBRARY_PATH为什么不会在可执行文件加载后反映在可执行文件上?

11

我正在尝试从我的C++程序中更改LD_LIBRARY_PATH。我可以使用getenv("LD_LIBRARY_PATH")获取其值,并使用setenv()设置其值(我知道这个方法是有效的,因为当我再次调用getenv("LD_LIBRARY_PATH")时,我得到了更新后的值),但是在程序内部更改它的值并没有任何效果: 我仍然会收到以下错误信息:

未能加载共享库文件

如果在可执行文件被加载或应用程序启动之前设置该值,则运行正常。


3
我会简单地编写一个Shell包装器,在执行二进制ELF可执行文件之前适当地设置LD_LIBRARY_PATH。这是常见的做法(大多数发行版都为firefox这样做)。 - Basile Starynkevitch
Basile,感谢您的回复。我正在尝试按照您所说的编写一个shell包装器,但问题是我需要在终端中运行脚本才能使导出路径起作用。如果我尝试在系统启动时启动我的应用程序,则无法实现相同的效果。 - Thiyagarajan
不,只需运行 chmod a+x 文件名.sh,将 文件名.sh 放入您 PATH 中的某个目录中,然后您就可以简单地运行它作为 文件名.sh - Basile Starynkevitch
我正在系统启动时使用application.sh启动我的应用程序,该脚本执行filename.sh(设置路径的shell脚本),但它不起作用,路径未设置。 - Thiyagarajan
然后使用完整路径,例如 $HOME/bin/filename.sh/usr/local/bin/filename.sh。查看 firefoxmozilla 中的内容;它通常是一个 shell 脚本... - Basile Starynkevitch
1个回答

16

很遗憾,从正在运行的程序中设置LD_LIBRARY_PATH将不会对其产生影响。原因是LD_LIBRARY_PATH由动态链接加载器(ld.so)处理,该程序启动您的程序。您的程序本身不处理LD_LIBRARY_PATH,因此更改它将没有任何效果。


5
除非程序在调用dlopen加载插件后调用,否则更改LD_LIBRARY_PATH不会产生任何影响。 - Basile Starynkevitch
同意。任何子进程(原始进程的)都会继承在该原始进程中进行的LD_LIBRARY_PATH更改。因此,在程序中设置LD_LIBRARY_PATH,然后分叉和杀死父进程应该将您放置在您想要的负载路径方面(我推测)。 - Nildram

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接