找不到 Linux 上的共享库
Shared Library on Linux is not found
我从源代码在 Ubuntu Linux 16.0.2 上构建了一些共享库。
它们是 64 位库。
我手动复制到/usr/local/lib。
我确认 /usr/local/lib 路径确实在 ld.so.conf 包含的 .conf 文件之一中。
然后我运行: sudo ldconfig 来更新缓存。
但是当我尝试 运行 我的可执行文件试图动态加载我之前使用 dlopen 复制到 /usr/local/lib 的 .so 文件之一时,它失败了。
在我的代码中,我有:
dlopen ("foobar.so", RTLD_LAZY);
谁能告诉我我做错了什么?
动态链接器通常不会直接访问从/etc/ld.so.conf
递归包含的路径,而是使用缓存。
您可以使用
更新缓存
sudo ldconfig
有关详细信息,请参阅 ldconfig(8)。
为了 dlopen
工作,没有可找到共享对象的位置的目录列表。所以这样做 dlopen("somefile", ...);
可能行不通。
您无需使用任何路径或放置共享对象(或遵守命名约定)即可通过dlopen(3)
使用共享对象。这只是在启动时加载和链接所有共享库的动态链接器的要求:linux-vdso.so.1
(64 位)
要进行测试,只需将共享放在您的本地目录中并尝试使用它的基本名称打开它,就像您一样post。
对于系统库,要求比较多,比如为库定义一个soname,供loader加载库,构建缓存数据库索引, 所以如果你不知道我在说什么,你将无法使用自动加载程序。如果您想查看一个可执行文件是否包含它需要的所有库以及加载程序在哪里找到它们,只需 运行 ldd(1)
将可执行文件作为参数,您将看到自动加载的依赖项以及动态链接器如何解析路径。
我从源代码在 Ubuntu Linux 16.0.2 上构建了一些共享库。
它们是 64 位库。
我手动复制到/usr/local/lib。
我确认 /usr/local/lib 路径确实在 ld.so.conf 包含的 .conf 文件之一中。
然后我运行: sudo ldconfig 来更新缓存。
但是当我尝试 运行 我的可执行文件试图动态加载我之前使用 dlopen 复制到 /usr/local/lib 的 .so 文件之一时,它失败了。
在我的代码中,我有:
dlopen ("foobar.so", RTLD_LAZY);
谁能告诉我我做错了什么?
动态链接器通常不会直接访问从/etc/ld.so.conf
递归包含的路径,而是使用缓存。
您可以使用
更新缓存sudo ldconfig
有关详细信息,请参阅 ldconfig(8)。
为了 dlopen
工作,没有可找到共享对象的位置的目录列表。所以这样做 dlopen("somefile", ...);
可能行不通。
您无需使用任何路径或放置共享对象(或遵守命名约定)即可通过dlopen(3)
使用共享对象。这只是在启动时加载和链接所有共享库的动态链接器的要求:linux-vdso.so.1
(64 位)
要进行测试,只需将共享放在您的本地目录中并尝试使用它的基本名称打开它,就像您一样post。
对于系统库,要求比较多,比如为库定义一个soname,供loader加载库,构建缓存数据库索引, 所以如果你不知道我在说什么,你将无法使用自动加载程序。如果您想查看一个可执行文件是否包含它需要的所有库以及加载程序在哪里找到它们,只需 运行 ldd(1)
将可执行文件作为参数,您将看到自动加载的依赖项以及动态链接器如何解析路径。