我的程序使用来自某个供应商的“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 那么问题就解决了。
最佳答案
我认为你有三个选择:
创建一个脚本文件(例如 bash、Python 等),在执行二进制程序之前设置
LD_LIBRARY_PATH
并使其可执行。使用
-rpath
链接器选项,除了LD_LIBRARY_PATH
之外,还向动态链接器将使用的搜索路径添加固定的绝对路径。dlopen
具有自下而上的绝对路径。即首先是dlopen
依赖项,然后是dlopen
主库。
我更喜欢第一个选项。
关于c++ - 在自定义库位置的情况下使用 dlopen 加载依赖库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59626829/