C++ 加载失败,但在此之前LD_LIBRARY_路径刚刚正确更新,为什么?
我有一个依赖于外部应用程序的库(我们称之为mydll.so),即Matlab。为了动态加载C++ 加载失败,但在此之前LD_LIBRARY_路径刚刚正确更新,为什么?,c++,linux,qt,dynamic-loading,qlibrary,C++,Linux,Qt,Dynamic Loading,Qlibrary,我有一个依赖于外部应用程序的库(我们称之为mydll.so),即Matlab。为了动态加载mydll.so,我编写了如下代码(Ubuntu、g++4.8.5、Qt5.12.6): 这很奇怪,因为load()函数正在抱怨来自Matlab的库,即libMatlabDataArray。因此它的路径已经包含在LD_library_path中。但是,如果我在相同的环境中运行ldd,我有: user@everest:~/code$ ldd /home/user/code/test/lnx_x64/debug
mydll.so
,我编写了如下代码(Ubuntu、g++4.8.5、Qt5.12.6):
这很奇怪,因为load()
函数正在抱怨来自Matlab的库,即libMatlabDataArray。因此
它的路径已经包含在LD_library_path中。但是,如果我在相同的环境中运行ldd
,我有:
user@everest:~/code$ ldd /home/user/code/test/lnx_x64/debug/mydll.so
linux-vdso.so.1 (0x00007ffcb4da2000)
libMatlabDataArray.so => /usr/local/MATLAB/extern/bin/glnxa64/libMatlabDataArray.so (0x00007f6af95f2000)
libMatlabEngine.so => /usr/local/MATLAB/extern/bin/glnxa64/libMatlabEngine.so (0x00007f6af93e7000)
这意味着libMatlabDataArray。因此可以通过ldd
命令找到,并且LD\u LIBRARY\u PATH
的内容是正确的。那么,在我的情况下,这个问题背后的原因是什么
更新1:如果我在应用程序启动之前设置了LD\u LIBRARY\u路径,则一切正常。在启动应用程序之前设置LD_LIBRARY_路径与在应用程序内部设置LD_路径有什么区别?问题在于您在进程内更改了环境变量LD_LIBRARY_路径。但是,该过程仍然使用带有旧值的“旧”环境变量块。因此,它无法正确地找到依赖库,并最终失败。
因此,您的方法将不起作用。我将提出以下解决办法:
- 在启动进程之前设置
LD_LIBRARY_PATH
变量,以便进程可以考虑更新的块
- 尝试使用
QCoreApplication::setLibraryPath()
函数设置库搜索路径
什么qputenv()
返回?此外,您确定您的进程使用了新设置的LD\u LIBRARY\u PATH
值吗?如果在启动应用程序之前设置它会怎么样?使用strace-o log-f/path/to/my/binary
运行二进制文件,然后log
将显示库加载器在哪里查找库。@vahancho返回true。此外,在调用qputenv()
之后,我添加了一行,如std::system(“gnome终端”)代码>。从打开的终端上,我看到LD\u LIBRARY\u PATH
的值正常,ldd
在该终端上也可以正常工作。@vahancho如果我在应用程序之前设置LD\u LIBRARY\u PATH,它就可以正常工作!!!在这种情况下会出现什么问题?@Gupta,当您修改流程中的环境变量时,流程仍然使用旧值。您应该在启动进程之前更改环境。如果我在运行时使用QCoreApplication::setLibraryPath()
,我想以后可以加载我的库吗。文档介绍了该函数:“设置加载库时要搜索的目录列表…”
我做了测试。它不起作用。它甚至没有在Linux上更新LD_LIBRARY_路径。
Cannot load library /home/user/code/test/lnx_x64/debug/mydll.so: (libMatlabDataArray.so: cannot open shared object file: No such file or directory)
user@everest:~/code$ ldd /home/user/code/test/lnx_x64/debug/mydll.so
linux-vdso.so.1 (0x00007ffcb4da2000)
libMatlabDataArray.so => /usr/local/MATLAB/extern/bin/glnxa64/libMatlabDataArray.so (0x00007f6af95f2000)
libMatlabEngine.so => /usr/local/MATLAB/extern/bin/glnxa64/libMatlabEngine.so (0x00007f6af93e7000)