c++ - 在自定义库位置的情况下使用 dlopen 加载依赖库

标签 c++ linux dll shared-libraries dlopen

我的程序使用来自某个供应商的“libone.so”对象。它在系统内具有自定义位置。程序搜索该库位置,然后使用 dlopen 打开它。当“libone.so”在幕后做一些事情并开始加载“libsecond.so”时,就会出现问题。我通过 strace 看到 dlopen 尝试通过为 ldconfig 定义的标准路径查找“libsecond.so”,但不使用“libone.so”的位置作为可能的路径之一。

是否可以在“libone.so”中配置 dlopen 调用,以便从“libone.so”的位置加载“libsecond.so”? (“libsecond.so”与“libone.so”位于同一路径)

ps。在程序启动之前我无法影响系统配置(ldconf 路径)。我需要在我的程序中解决这个问题。

ps。如果我将“libone.so”的路径添加到/etc/ld.so.conf.d/custom.conf 那么问题就解决了。

最佳答案

我认为你有三个选择:

  1. 创建一个脚本文件(例如 bash、Python 等),在执行二进制程序之前设置 LD_LIBRARY_PATH 并使其可执行。

  2. 使用-rpath链接器选项,除了LD_LIBRARY_PATH之外,还向动态链接器将使用的搜索路径添加固定的绝对路径。

  3. dlopen 具有自下而上的绝对路径。即首先是 dlopen 依赖项,然后是 dlopen 主库。

我更喜欢第一个选项。

关于c++ - 在自定义库位置的情况下使用 dlopen 加载依赖库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59626829/

相关文章:

c++ - std::map 无法处理多态性?

c++ - "Is there a better way?"Windows Vista 上的 wininet 错误 12029

c++ - 与 C++ 相比,Vala 是一种理智的解析语言吗?

c# - 如果你不引用它的所有依赖项,你可以使用类库吗?

C++ 赋值构造函数 Valgrind 错误

linux - 如何使用 git 在本地主机和服务器之间复制文件?

linux - 如何仅从 TCPDUMP 文件中提取目标端口

sql-server - Sql Server MacOS/Linux 上用户 sa 的 dotnet ef 脚手架登录失败

c++ - 当您的外部 SDK 只有.dll、.lib、.h 文件时如何链接和构建项目

c# - Protobuf-net 编译为 DLL 字符串 [] 导致损坏的 dll