C++ 加载失败,但在此之前LD_LIBRARY_路径刚刚正确更新,为什么?

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),即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
    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)