我已经从源代码在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);
有谁能告诉我我做错了什么?
答案 0 :(得分:2)
答案 1 :(得分:0)
要使dlopen
起作用,找不到共享对象的地方没有目录列表。所以做dlopen("somefile", ...);
可能行不通。
您不需要使用任何路径或放置共享对象(或遵守命名约定)来通过dlopen(3)
使用共享对象。这只是动态链接器在发布时加载和链接所有共享库的要求:linux-vdso.so.1
(64位)
要测试,只需将共享放在您的本地目录中,然后尝试使用它的基本名称打开它,就像发布一样。
对于系统库,有更多的需求,比如为库定义 soname ,加载器使用它来加载库和构造缓存数据库索引,所以如果你有不知道我在说什么,你将无法使用自动加载程序。如果你想查看一个可执行文件是否包含它需要的所有库以及加载器找到它们的位置,只需运行带有可执行文件作为参数的ldd(1)
,你就可以看到自动加载的依赖关系以及动态如何链接器解析路径。