一、库的基本概念
1、库
Linux下编译生成一个可执行文件时,需要将这个可执行文件需要的函数目标文件包含进去。对于一个较大的工程来说可能有很多的函数目标文件,这些目标文件可能会被其他工程或程序所调用,因此比较好的方法是将这些函数目标文件组合在一个单独的文档文件中,这就是库文件。
2、库的概念
库有两种形式:静态库和共享库。
(1)静态库的代码在编译时就已连接到开发人员开发的应用程序中。
(2)共享库只是在程序开始运行时才载入,在编译时,只是简单地指定需要使用的库函数。
由于共享库并没有在程序中包括库函数的内容,只是包含了对库函数的引用,因此可执行文件的代码规模比较小。
但是要注意,对于加载了静态库的可执行文件,由于静态库的代码已经连接进入了可执行程序中,所以静态库与可执行文件的路径没有关系了,可执行文件可以放置在任何路径下。而对于加载了共享库的可执行文件,共享库的路径与可执行文件的位置有直接的关系,位置错误可执行文件将无法正常运行。
Linux系统已经开发的大多数库都采取共享库的方式。
3、库的名字
系统中可用的库都存放在/usr/lib和/lib目录中。库文件名由前缀lib和库名以及后缀组成。根据库的类型不同,后缀名也不一样。
(1)静态库的后缀名为.a
,如libname.a。
(2)共享库的后缀名由.so
和版本号
组成,如libname.so.5。
这里的name可以是任何字符串,用来唯一标识某个库。该字符串可以是一个单字、几个字符、甚至一个字母。如数学共享库的库名为libm.so.5,这里的标识字符为m,版本号为5。libm.a则是静态数学库。X-Windows库名为libX11.so.6,这里使用X11作为库的标识,版本号为6。C语言的标准函数库名字为libc.so后接版本号。
4、GCC与库
在/usr/lib和lib目录中可以找到绝大多数的共享库。GCC编译器连接时将首先搜索这两个目录。有一些库也可能存放在特定的目录中,在/etc/ld.so.conf配置文件中给出了这些目录的列表。连接程序也会对配置文件中列出的这些目录进行搜索。在默认情况下,Linux将首先搜索指定库的共享版本,如果找不到,才会去搜索静态版本。
如果程序员自己编写了库文件,并打算GCC连接时自动找到该库文件可以怎么做呢?
首先,将该库文件复制进入/usr/lib或/lib中,或者将该库文件的绝对路径加入/etc/ld.so.conf配置文件中。
然后运行ldconfig 命令进行更新。
二、静态库的创建与使用
vim output.c
#include<stdio.h>
void output(char str[]){
printf("hello,%s\n",str);
}
vim main.c
#include<stdio.h>
void output(char str[]);
int main(){
char name[]="neusoft";
output(name);
return 0;
}
1、静态库的创建
(1)生成目标文件
(2)生成静态库
-r选项:在库中插入模块(替换)。当插入的模块名已经在库中存在,则替换同名的模块。
-c选项:不论库是否存在都将创建,不给出警告。
s选项:强制更新库的符号表,即使库的内容没有发生变化,显示执行操作选项的附加信息。
2、静态库的使用
方法一
方法二
方法三
三、共享库的创建和使用
1、共享库的创建
(1)生成目标文件
-fpic选项产生位置独立的代码。由于库是在运行的时候被调入,因此这个选项是必需的,因为在编译的时候,装入内存的地址还不知道。如果不使用这个选项,库文件可能不会正确运行
(2)生成共享库
2、共享库的使用
方法一
将共享库libshare.so拷贝到/usr/lib
方法二
查看可执行文件使用的共享库