【问题标题】:Resolving dynamic libraries dependencies when loading with dlopen()使用 dlopen() 加载时解析动态库依赖项
【发布时间】:2014-08-08 10:53:14
【问题描述】:

我在使用dlopen() 加载动态库时遇到问题: 我尝试加载一个库:

handle = dlopen("libmkl_intel_lp64.so", RTLD_LAZY);

此代码失败,来自dlerror() 的以下消息:

/opt/intel/composer_xe_2013_sp1.2.144/mkl/lib/intel64/libmkl_intel_lp64.so: undefined symbol: mkl_vsl_serv_threader_for

我知道这个符号可以在另一个库中找到,例如libmkl_gnu_thread.so。如果使用LD_PRELOAD 加载该库,上述未定义符号上的错误就会消失。但是如何在不使用LD_PRELOAD 的情况下使这个符号可用?

在显式链接的情况下,我会列出所有库,但我不确定在我使用 dlopen() 的情况下的逻辑是什么

【问题讨论】:

  • 只需使用 RTLD_GLOBAL 预先打开其他库。

标签: c linux dlopen


【解决方案1】:

您需要在 .so 文件中添加依赖项。这些依赖关系通过ldd 命令显示。它们以多种方式添加 - 最常见的是在编译 .so 时,添加 -l<dep> 以将依赖项添加到 <dep>.so 。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-12
    • 1970-01-01
    • 1970-01-01
    • 2020-04-24
    • 1970-01-01
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    相关资源
    最近更新 更多