linux中动态库libXXX.so
Posted igoodful
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux中动态库libXXX.so相关的知识,希望对你有一定的参考价值。
1、动态库的概念。动态链接库与普通的程序相比而言,没有main函数,是一系列函数的实现。通过shared和fPIC编译参数生产so动态链接库文件。程序在调用库函数时,只需要连接上这个库即可。
2、动态库的优点。可以实现进程之间的资源共享。就是说,某个程序的在运行中要调用某个动态链接库函数的时候,操作系统首先会查看所有正在运行的程序,看在内存里是否已有此库函数的拷贝了。如果有,则让其共享那一个拷贝;只有没有才链接载入。这样的模式虽然会带来一些“动态链接”额外的开销,却大大的节省了系统的内存资源。C的标准库就是动态链接库,也就是说系统中所有运行的程序共享着同一个C标准库的代码段。将一些程序升级变得简单。用户只需要升级动态链接库,而无需重新编译链接其他原有的代码就可以完成整个程序的升级。Windows 就是一个很好的例子。甚至可以真正坐到链接载入完全由程序员在程序代码中控制。 程序员在编写程序的时候,可以明确的指明什么时候或者什么情况下,链接载入哪个动态链接库函数。你可以有一个相当大的软件,但每次运行的时候,由于不同的操作需求,只有一小部分程序被载入内存。所有的函数本着“有需求才调入”的原则,于是大大节省了系统资源。比如现在的软件通常都能打开若干种不同类型的文件,这些读写操作通常都用动态链接库来实现。在一次运行当中,一般只有一种类型的文件将会被打开。所以直到程序知道文件的类型以后再载入相应的读写函数,而不是一开始就将所有的读写函数都载入,然后才发觉在整个程序中根本没有用到它们。编译时查找的是静态库或动态库,而运行时查找的只是动态库。gcc参数-L指定编译时的链接路径,-Wl,-rpath指定运行时链接路径。编译时使用环境变量LIBRARY_PATH指定库的路径,运行时使用环境变量LD_LIBRARY_PATH或/etc/ld.so.conf指定库的路径。编译时用的链接器是ld,而运行时用的链接器是/lib/ld-linux.so.2。编译时与运行时都会查找默认路径:/lib /usr/lib。编译时还有一个默认路径:/usr/local/lib,而运行时不会默认找查该路径。
3、动态库的创建。例如下面实现一个简单的整数四则运输的动态链接库,定义的caculate.h和caculate.c两个文件,生产libcac.so动态链接库。
定义库的头文件如下:
库中函数的实现如下:
4、动态库的使用方法之一。编写一个测试程序main.c调用此动态链接库的函数。编译生产可执行文件main如下:gcc main.c -o main -L ./ -lcac (其中-L指明动态链接库的路径,-l后是链接库的名称,省略lib)。
然后直接运行出现如下图,找不到动态库,说明这是运行时,命令main程序动态加载libcac.so库时没有找到,那么要么是系统不存在该文件,要么是存在该文件但是不在动态库的查找路径中。
解决办法。因为该动态库是老子亲手建立的,浪门可能不存在呢!所以只可能是可执行程序main没有找到动态库位置,因此设置动态库运行时。运行时使用的环境变量是LD_LIBRARY_PATH指定库的路径。如下图,问题得到解决。
5、动态库的使用方法之二。linux提供dlopen、dlsym、dlerror和dlcolose函数获取动态链接库的函数。通过这个四个函数可以实现一个插件程序,方便程序的扩展和维护。函数格式如下所示。
dlopen()是一个强大的库函数。该函数将打开一个新库,并把它装入内存。该函数主要用来加载库中的符号,这些符号在编译的时候是不知道的。写个测试程序调用上面生产libcac.so库如下所示。
同样需要设置动态库查找路径。
当然如果在编译时就指定运行时的动态链接库路径也是可以的。如下图就是。
6、动态库一般都会加上版本号作为后缀。动态库命名规范。
7、可执行程序在执行的时候如何定位共享库(动态库)文件 。
8、查看一个可执行程序依赖的共享库。获取某个命令执行时需要依赖哪些动态库,如果有依赖库找不到,那么程序会无法正常运行。
# ldd 命令的绝对路径
9、动态库中的函数名查找。
10、动态库的升级。
10、
以上是关于linux中动态库libXXX.so的主要内容,如果未能解决你的问题,请参考以下文章