Linux下如何添加动态库路径? (linux 添加动态库路径)

在Linux系统中,动态库是一种非常常见的资源类型。许多程序和应用程序在运行时需要动态库的支持,因此如何正确添加动态库路径成为了Linux系统运维和开发工程师需要掌握的一项技能。本文将介绍Linux下如何添加动态库路径,供读者参考。

1. 了解动态库

在Linux操作系统中,动态库是在程序运行时被加载的一种库文件。与静态库相比,动态库不是被编译链接到程序中的,而是在程序运行时才进行载入。动态库的使用可以帮助程序实现真正的动态调用,提高程序的灵活性,同时也可以减小程序体积,避免因为大量重复使用的库文件带来空间浪费。

Linux中的动态库一般以.so结尾,通过ldd命令可以查看当前程序所依赖的动态库列表。例如:

$ ldd /bin/ls

linux-vdso.so.1 => (0x00007ffd4a1c1000)

libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f2612f2e000)

libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2612b67000)

libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f2612936000)

libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f2612732023)

/lib64/ld-linux-x86-64.so.2 (0x00007f2613167000)

可以看到,/bin/ls程序所依赖的动态库包括linux-vdso.so.1、libselinux.so.1、libc.so.6、libpcre.so.3、libdl.so.2和ld-linux-x86-64.so.2等几个文件。

2. 添加动态库路径

默认情况下,Linux系统会在/lib、/usr/lib、/usr/local/lib等目录下查找动态库文件。如果程序需要使用的动态库没有在这些目录中找到,就会导致程序无法执行。

为了解决这个问题,可以通过添加动态库路径来指定Linux系统在特定目录下查找需要的动态库。有两种方法可以实现这个目的:

2.1. 使用LD_LIBRARY_PATH环境变量

Linux系统中,环境变量LD_LIBRARY_PATH可以用来指定程序查找动态库的目录顺序。设置这个环境变量可以使程序在运行时动态载入相应的库文件。例如:

$ export LD_LIBRARY_PATH=/opt/mylibs

$ ./myprogram

这段命令的意思是将/opt/mylibs目录添加到LD_LIBRARY_PATH环境变量的值中,然后运行名为myprogram的程序。

需要注意的是,环境变量LD_LIBRARY_PATH中应该指定包含动态库文件的目录,而不是具体的库文件路径。也就是说,如果/opt/mylibs目录下有两个库文件libfoo.so和libbar.so,那么LD_LIBRARY_PATH应该是这样的:

$ export LD_LIBRARY_PATH=/opt/mylibs

$ echo $LD_LIBRARY_PATH

/opt/mylibs

$ ldd /bin/myprogram

libfoo.so => /opt/mylibs/libfoo.so (0x00007fc2b89fc000)

libbar.so => /opt/mylibs/libbar.so (0x00007fc2b87f8000)

libc.so.6 => /lib64/libc.so.6 (0x00007fc2b842d000)

/lib64/ld-linux-x86-64.so.2 (0x000055d78f623000)

2.2. 在/etc/ld.so.conf文件中添加目录

除了使用环境变量LD_LIBRARY_PATH之外,还可以将需要添加的动态库路径写入/etc/ld.so.conf文件中。这个文件中可以包含一系列目录,在系统启动时会被系统动态库链接器读取,以便正确地载入程序所需要的动态库。

需要在/etc/ld.so.conf文件中添加需要查找的目录:

# echo “/opt/mylibs” > /etc/ld.so.conf.d/mylibs.conf

然后执行如下命令使当前系统已经更新的/ect/ld.so.cache文件失效,并重新生成一遍:

# ldconfig

这样,当程序需要使用libfoo.so和libbar.so时,dynamic linker会自动在/opt/mylibs目录下查找相应的库文件,程序就可以正常运行了。

3.

在本文中,我们介绍了Linux下如何添加动态库路径。对于开发人员或系统管理员来说,掌握这个技术非常有帮助。通过使用LD_LIBRARY_PATH环境变量或在/etc/ld.so.conf文件中添加目录,可以使程序在运行时自动查找到所需的动态库文件,避免因为动态库文件找不到而导致程序无法运行的问题。

相关问题拓展阅读:

linux怎样添加永久动态库环境变量

/etc/ld.so.conf文件里增加动团判态滑激库所在的路径

或者/etc/ld.so.conf.d下新建.conf文件塌让改,内容为加动态库所在的路径

Linux中如何创建静态库和动态库

静态库在程序编译时会被连接到盯激目标代码中,程序运行时将不再需要该静态库。 动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。 程序1: hello.h #ifndef HELLO_H #define HELLO_H void hello(const char *name); #endif //HELLO_H 程序2: hello.c #include void hello(const char *name) { printf(“Hello %s!\n”, name); } 程序3: main.c #include “hello.h” int main() { hello(“everyone”); return 0; } 无论动态库还是静态库都需要用到.o文件来生成,先编译生成.o文件。 # gcc -c hello.c 1:创建静态库 静态库文件名的命名规范是以lib为前缀,紧接着跟静态库名,扩展名为.a。例如:我们将创建的静态库名为myhello,则静态库文件名就是libmyhello.a。 # ar cr libmyhello.a hello.o 使用静态库:只需要在你的源程序中加入包含你所需要凯蚂袜使用到的函数的声明(即包含头文件),然后在gcc生成目标文件时候指明静态库就OK了(除非你包含的头文件在/usr/include,库文件在标准库/usr/lib,/lib下,否则你得显示指明他们的路径) # gcc -o hello main.c -L. -lmyhello # ./hello Hello everyone! 删除静态库文件运行./hello,程序正常运行,说明静态库公用函数已经链接到目标文件。 2: 利用.o文件创建动态库 动态库文件扩展名为.so。 # gcc -shared -fPCI -o libmyhello.so hello.o 动态库的使用与静物档态库使用方式一样 # gcc -o hello main.c -L. -lmyhello # ./hello ./hello: error while loading shared libraries: libmyhello.so: cannot open shared object file: No such file or directory 哦!出错了。快看看错误提示,原来是找不到动态库文件libmyhello.so。程序在运行时,会在/usr/lib和/lib等目录中查找需要的动态库文件。若找到,则载入动态库,否则将提示类似上述错误而终止程序运行。

关于linux 添加动态库路径的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。


数据运维技术 » Linux下如何添加动态库路径? (linux 添加动态库路径)