c - 使用 dlopen() 加载时解决动态库依赖关系

标签 c linux dlopen

我在使用 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 加载该库,上述关于 undefined symbol 的错误就会消失。但是,如何在不使用 LD_PRELOAD 的情况下使该符号可用?

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

的情况下逻辑是什么

最佳答案

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

关于c - 使用 dlopen() 加载时解决动态库依赖关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25201860/

相关文章:

c - 从我的队列中删除所有项目

c++ - 如何知道 dlopen() 时没有 .so

c++ - `dlopen` 'ing a .so 包含符号导致 undefined symbol

c - C 中的指针给出负值

c - C 中的三元条件运算符

linux - 如何从不可预测格式的文件中提取单行/多行正则表达式匹配项并将每个项放在一行中到输出文件中?

linux - Linux 下的 FTDI TTL

linux - 加载可执行文件或执行库

c - 我有神秘的 C 代码,在同一测试用例中有不同的行为,我认为这是 coodblock 问题

linux - selinux 阻止用户监听小于 32768 的端口(不,它大于 1024)