我在使用 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/