首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QLibrary:加载失败,但在此之前LD_LIBRARY_PATH刚刚正确更新,为什么?

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

Stack Overflow用户
提问于 2020-11-27 16:21:08
回答 1查看 508关注 0票数 0

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

代码语言:javascript
复制
// 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;
}

以上代码在此消息中失败:

代码语言:javascript
复制
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,那么我有:

代码语言:javascript
复制
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.so可以通过ldd命令找到,并且LD_LIBRARY_PATH的内容是正确的。那么,在我的案例中,这个问题背后的原因是什么呢?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-02 14:12:01

问题是您在流程中更改了环境变量LD_LIBRARY_PATH。但是,该过程仍然使用“旧”环境变量块和旧值。因此,它无法正确地找到依赖库并最终失败。因此,你的方法是行不通的。我提出以下解决办法:

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

F 210

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65040579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档