QLibrary::加载失败,但在此之前LD_LIBRARY_PATH刚刚正确更新,为什么



我有一个依赖于外部应用程序(即Matlab(的库(我们称之为mydll.so(。为了动态加载mydll.so,我编写了这样的代码(Ubuntu,g++4.8.5,qt 5.12.6(:

// update LD_LIBRARY_PATH with ALL required paths (Matlab, boost, etc.)
bool res = qputenv("LD_LIBRARY_PATH", required_path.toStdString().c_str());
assert(res);
// loading the dll
QLibrary my_dll;
my_dll.setFileName(dll_path);
if (!my_dll.load())
{
std::cout << my_dll.errorString().toStdString() << std::endl;
}

以上代码失败,并显示以下消息:

Cannot load library /home/user/code/test/lnx_x64/debug/mydll.so: (libMatlabDataArray.so: cannot open shared object file: No such file or directory)

这很奇怪,因为load()函数抱怨来自Matlab的库,即libMatlabDataArray.so,它的路径已经包含在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)

这意味着ldd命令可以找到libMatlabDataArray.so,并且LD_LIBRARY_PATH的内容是正确的。那么,在我的情况下,这个问题背后的原因是什么呢?

更新1:如果在应用程序启动之前设置LD_LIBRARY_PATH,则一切正常。在启动应用程序之前设置LD_LIBRARY_PATH和在应用程序内部设置有什么区别?

问题是您在流程中更改了环境变量LD_LIBRARY_PATH。然而,该过程仍然使用";旧的";环境变量块使用旧值。因此,它无法正确查找依赖库,最终失败。因此,你的方法不会奏效。我将提出以下解决方案:

  • 在启动进程之前设置LD_LIBRARY_PATH变量,以便进程可以考虑更新的块
  • 尝试使用QCoreApplication::setLibraryPaths()函数设置库搜索路径

相关内容

  • 没有找到相关文章

最新更新