【发布时间】:2020-04-24 20:47:16
【问题描述】:
我的程序使用来自某个供应商的“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 路径)。我需要在我的程序中解决这个问题。
pss。如果我将'libone.so'的路径添加到/etc/ld.so.conf.d/custom.conf,那么问题就解决了。
【问题讨论】:
-
libsecond.so是“自动”加载的还是libeone.so做了一些魔法(像你一样)? -
能否设置/修改执行环境?
LD_LIBRARY_PATH环境变量可以解决问题。 -
@MaxLanghof libsecond.so 由 libone.so 自动加载。如果两个库都位于标准路径(比如 /usr/lib),那么没问题。我的情况是这个库的位置是自定义的,我加载第一个库,第二个库应该由第一个加载。
-
@JL.Sanchez 我尝试在我的程序中使用从 stdlib.h 调用 LD_LIBRARY_PATH 的 'setenv' 在第一个库的“dlopen”之前执行此操作,但它没有帮助。我可以'不要提前设置 LD_LIBRARY_PATH 并且不能像这样启动我的程序:LD_LIBRARY_PATH=my_path ./my_program
标签: c++ linux dll shared-libraries dlopen