Linux操作系统广泛应用于各种领域,而动态链接库(Dynamic Linking Library,简称动态库)是Linux系统中十分重要的一部分,它可以方便地为不同的应用程序提供共享代码,减小程序的体积,提高程序的运行效率。加载动态库时,Linux系统会按照一定的顺序搜索动态库路径,找到可用的动态库后再加载到程序中。因此,掌握动态库加载路径的技巧对于Linux程序员来说十分必要。本文将介绍一些。
1. 系统默认的动态库加载路径
在Linux系统中,系统默认的动态库加载路径一般为/lib和/usr/lib目录,程序在加载动态库时会自动在这些目录下搜索。如果需要将自己的动态库加入到这些路径下,可以使用以下命令:
sudo cp libxxx.so /usr/lib/
sudo ldconfig
这样做可以将动态库复制到/usr/lib目录下,并更新系统动态库缓存。需要注意的是,在进行类似操作时要格外小心,避免误操作导致系统出现问题。
2. 设置LD_LIBRARY_PATH环境变量
除了默认的动态库加载路径,Linux系统还提供了一种设置动态库加载路径的方法,即通过设置LD_LIBRARY_PATH环境变量来指定动态库的路径。例如,如果想将动态库path加入到动态库加载路径中,可以使用以下命令:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/
这样做可以将/path/目录加入到动态库加载路径中。需要注意的是,设置LD_LIBRARY_PATH环境变量时,要避免与系统默认的加载路径相冲突。
3. 应用程序中指定动态库加载路径
有些情况下,需要在应用程序中指定动态库加载路径,例如如果一个应用程序需要使用不同版本的同名动态库,就需要在应用程序中指定加载路径。在C/C++程序中,可以使用以下函数来指定动态库加载路径:
#include
void* dlopen(const char *filename, int flag);
这里的filename参数指定动态库的文件名(含路径),flag参数可以指定加载方式和操作方式(如RTLD_NOW表示立即加载动态库)。需要注意的是,dlopen加载动态库时会优先搜索当前目录下的动态库文件,如果需要使用其他路径下的文件,必须在文件名前加上路径。
4. 使用LD_PRELOAD指定预加载库
Linux系统还提供了一个LD_PRELOAD环境变量,可以使用它来指定预加载库。预加载库是指在应用程序加载动态库之前,先在LD_PRELOAD指定的库中查找符号,如果找到则使用预加载库中的符号,否则在默认的动态库路径以及应用程序指定的路径中查找。这种方法可以用于在不修改应用程序源码的情况下,替换掉应用程序中的函数实现,具有一定的灵活性。
相关问题拓展阅读:
- 关于linux下连接动态库问题
- linux中如何将动态链接库嵌入到可执行程序
关于linux下连接动态库问题
很桥野奇怪的游消尘gcc用法, 链接库的时候你应该神禅使用选项”-l”来指定, 而不是像个c文件一样直接写在后面.
gcc编译时,当使用动态库编译可以按照几种写法
1.gcc test.c ./libSDL2-2.so
2.gcc test.c -lSDL2-2
3.gcc test.c -L/home/test -lSDL2-2
一般的编译参数都是按照2或3去写
2写法的含义是从/lib或者/usr/lib目录下寻找名称为SDL2-2的库,即寻找/lib/libSDL2-2.so或者/usr/lib/libSDL2-2.so文件进行链接,当然如果没有动态库升咐就会去找静态库,再没有应该就会在编译时报错
3写法的含义是从-L参数首先从指定的目录中寻找需要链接的库文件,随后再去寻找系统文件夹中是否存在需要的库
1写法的含义是将当前目录下的./libSDL2-2.so.0文件链接进最终文件,因此执行readelf -a a.out后在动态库部分所看到的路径就是./libSDL2-2.so.0,进而在执行文件时仅会从当前目录下寻找libSDL2-2.so.0文件,当执行文件时所在的目录下没有该文件时就会出现找不到库文件的操作吵困纯
你第二次操作时,因为function.so库文件与a.out文件在同一个目录,同时也是在该目录下执行的ldd操作及运行a.out,a.out在加载动态库时从当前目录下找到了所需要的库文件,此时能够执行成功(ldd命令实质是一个脚本,通过设置环境变量运行动态库链接器来输出所有待链接的动态库)。
你可以试试将a.out拷贝至其他目录再次运行,将出现和之一次操作时一样的现象,找不到function.so文件。
具体的解决方法就是修改编译参数,将./libSDL2-2.so.0修改为-lSDL2-2并将libSDL2-2.so.0文件拷贝至/usr/lib目录下,并且可能因为没有修改链接器的缓存文件(将可能找不到带版本号后缀的动态库),需要在/usr/lib目录下建立一个文件连接(ln -s libSDL2-2.so.0 libSDL2-2.so)或尺游者直接修改名称为libSDL2-2.so
/etc/ld.so.conf 里或者环境高闭变山搜量里添加库路径,或者要戚唯裂把文件放到/usr/lib这样的路径里面,再更新一下ld.so.conf文件
linux中如何将动态链接库嵌入到可执行程序
动态库是运行时加载,动态库有自己瞎埋的加载路径;运行时会从固定路径败埋加载;
即需要把动态库放到固定路径下;
比如linux的察神蚂/lib/目录下
linux动态库加载 路径的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux动态库加载 路径,精通Linux动态库加载路径的技巧,关于linux下连接动态库问题,linux中如何将动态链接库嵌入到可执行程序的信息别忘了在本站进行查找喔。
香港服务器首选树叶云,2H2G首月10元开通。
树叶云(www.IDC.Net)提供简单好用,价格厚道的香港/美国云服务器和独立服务器。IDC+ISP+ICP资质。ARIN和APNIC会员。成熟技术团队15年行业经验。
文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/156528.html<