引子
近日,服务器迁移后,偷懒未重新编译nginx的,直接./nginx启动,结果遇到如下问题:
“error while loading shared libraries”
这是是因为需要的动态库不在动态链接器ld.so的搜索路径导致。
ld.so 动态共享库搜索顺序
1、ELF可执行文件中动态段DT_RPATH指定;gcc加入链接参数“-Wl,-rpath”指定动态库搜索路径;
2、环境变量LD_LIBRARY_PATH指定路径;
3、/etc/ld.so.cache中缓存的动态库路径。可以通过修改配置文件/etc/ld.so.conf 增删路径(修改后需要运行ldconfig命令);
4、默认的 /lib/;
5、默认的 /usr/lib/
与动态链接库相关命令
(1)ld 是gcc的链接程序。
(2)ldd是查看可执行文件中所依赖的库的程序,比如想查main程序用到了那些动态库,可以直接
ldd main
(3)ldconfig用来更新文件/etc/ld.so.conf的修改生效。
(4)nm用来查看.so库中的函数名字,标记是T的就是动态库里面生成的名字。如:nm /lib/libc*.so
Linux 下动态链接库搜索路径问题
Linux动态链接库的搜索路径按优先级排序为:
1.编译目标代码时指定的动态库搜索路径;
在编译时通过gcc 的参数”-Wl,-rpath,”指定。当指定多个动态库搜索路径时,路径之间用冒号”:”分隔。
2.环境变量LD_LIBRARY_PATH指定的动态库搜索路径;
3.配置文件/etc/ld.so.conf中指定的动态库搜索路径;
/etc/ld.so.conf的第一行有个引用命令:include ld.so.conf.d/*.conf
因此,最优雅的方式是在ld.so.conf.d目录下创建一个你的程序依赖的配置文件,配置文件内容为程序依赖的动态链接库的路径,一个路径一行。
添加完配置文件后执行ldconfig使其生效。
4.默认的动态库搜索路径/lib;
5.默认的动态库搜索路径/usr/lib;
1、可以用 LD_LIBRARY_PATH 环境变量指定,这个类似于 PATH 机制,比较直观,而且,可以放到 bashrc 中固化下来,也可以放到自己的 .bashrc 中只对本用户起作用;
2、如果启用了 ld.so.cache 的话,系统会在 /etc/ld.so.cache 中存储所有可引用的动态链接库。这个文件的内容可以通过 /etc/ld.so.conf 来指定;这个是比较固定的机制,对全局所有用户都有影响;不过更改设置后需要 root 调用 ldconfig 来刷新一下。
3、默认的标准库路径,这个似乎不用设置就可以。包括 /lib 和 /usr/lib。当然,如果是64位系统,还包括 /lib64 和 /usr/lib64。
4、其它情况,如果只想对某一个特定的应用程序起作用的话,可以在编译时指定搜索路径。gcc 的 -Wl 和 -rpath 参数。
奇怪的是, /usr/local/lib 和 /usr/local/lib64 居然不在标准路径之列。
总结
以上所述是小编给大家介绍的Linux下动态链接库加载路径及搜索路径问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对小牛知识库网站的支持!
问题内容: 如何从库本身中获取共享库的路径? 换句话说,假设使用来加载库X ,如何从库本身内部访问用于加载所述库的路径? 请注意,我不能首先将这个库加载到该库中。 更新: 这是使用静态变量的方法: 问题答案: 动态链接器实际上搜索几个位置以找到每个动态库。其中包括(来自man ld.so): 环境变量给定的路径 烘焙到二进制文件中的路径将加载条目下的库 缓存文件/etc/ld.so.cache /
开发了一个功能 jar 包,依赖动态库。为了方便分发,动态库打包到了 resources 目录, 用的 Native.loadLibrary 方法载入。 在 IDEA 开发环境下直接运行,正常。 打包 jar 自己运行,正常。 被其他项目以 jar 库形式依赖,其他项目调用接口,报错,找不到动态库。 感觉这应该是一个比较常见的诉求吧,也不知道众多其他第三方库都是怎么处理的。
输入出发地和抵达地,可搜索前往目的地的路径。 轻触(选项)>[搜索路径],在出发地与抵达地的字段各自输入关键词并轻触[搜索]。地图会显示最短路径。 可从书签中选择出发地及抵达地。请轻触(书签),选择地点。 A ) (徒步)/(乘车) 可选择路径的移动方式。轻触即会以选择的移动方式搜索最短路径。 B ) 与目的地间的距离及所需时间 C ) (显示列表)/(隐藏列表) 轻触即可将搜索结果列表切换为显示
问题内容: 我有一个遵循标准目录布局的项目设置(虽然未使用Maven): 本机DLL位于资源文件夹中,而源位于Java文件夹中。resources文件夹是Java类路径的成员。 我现在想加载DLL,而不必设置JRE 选项或设置变量,以便可以通过简单的双击来启动生成的jar文件。 运行jar文件时是否可以将资源文件夹添加到库搜索路径而无需进行其他配置?例如,设置与清单中的相似? 问题答案: 直到今天
在运行jar文件时,有没有可能将资源文件夹添加到库搜索路径中,而不必做额外的配置?例如。使用与清单中的类似的设置?
是否缺少配置设置?