我目前正在使用C中的userland,LD_LIBRARY_PATH似乎不是我的一种选择,因为在我的系统(X86_64 openSUSE)上,它似乎没有默认设置。获得存储库的所有目录的最佳方法是什么?
发布于 2017-10-08 22:04:23
/usr/lib64和/lib64用于64位二进制文件,/usr/lib和/lib用于32位二进制文件,而不是从/etc/ld.so.conf获取的包含信任的路径。
来自man ldconfig
ldconfig为命令行、文件/etc/ld.so.conf和受信任目录中指定的目录、/lib和/usr/lib创建了必要的链接和缓存(在x86-64、/lib和/usr/lib等64位体系结构上,/lib和/usr/lib是32位库的受信任目录,/lib64和/usr/lib64用于64位库)。 缓存由运行时链接器ld.so或d-linux.so使用。
..。
/etc/ld.so.conf文件,其中包含一个目录列表,每行一个,在其中搜索库。
请注意,此信息用于openSUSE,其他发行版可能使用不同的路径。
发布于 2017-10-09 19:06:48
LD_LIBRARY_PATH是标准的环境变量,当用户无法或无法访问安装共享库的系统目录时,用户可以添加和加载自己的库。
有一个文件通常由ldconfig在引导时读取(它读取/etc/ld.so.conf以创建二进制DBMsomewhat文件/etc/ld.so.cache,带有一个哈希表以快速访问加载库共享对象时使用的路径),这个文件由动态加载器使用(作为内核工具,只有一个这样的东西,所以它不依赖于运行哪个发行版,而是取决于您使用的内核版本-它已经发生了一些变化,但没有内核那样多)。
要知道动态加载程序正在使用哪些子名称(soname是共享对象引用接口所使用的公共名称,这是保证共享对象与库兼容所必需的),只需运行
ldconfig -p你就会注册所有的声子名,而通往图书馆的路径也会被加载。
如果您想知道动态加载程序将加载哪些库,只需执行以下命令:
ldd your_executable它将打印可执行文件所需的奏鸣曲以及它们在系统中的位置。
ldconfig(8)所做的就是在文件/etc/ld.so.conf中包含的目录中搜索共享对象文件,并查找其名称与存储在文件中的索纳名匹配的所有目录,并包含对文件名为soname的引用。表完成后,文件/etc/ld.so.cache由/lib64/ld-linux-x86-64.so.2创建和使用,该共享模块负责加载程序使用的其余共享库的用户模式。
拥有一个本地$HOME/lib目录来存储本地开发的共享库没有问题,但由于该目录通常不会包含在/etc/ld.so.conf中,因此您需要创建LD_LIBRARY_PATH=${HOME}/lib并小心地将其导出为,从不尝试将其用作根用户,因为对于禁用env变量的根用户而言。
编辑1
顺便说一句,如果您需要按需加载共享库(这可能就是您所需要的),请阅读有关dlopen(3)和朋友函数的内容,因为这是大多数程序用于动态加载模块的方法,在编译主程序之前您还没有听说过。您需要加载模块,查找所需的符号(dlsym(3)或dlfunc(3)),存储模块提供的引用,最后调用它们。
https://stackoverflow.com/questions/46636461
复制相似问题