加粗样式
Linux下静态库和动态库的创建及使用
静态库文件后缀为 **.a**,动态库文件后缀为**.so**本次以简单的两个函数的集合来描述这些库的创建以及使用:
建立这样几个目录:
**Function HeadFile Lib Media Outfile SourceCode**
作用从左至右分别是:
函数主体存放,头文件存放,库文件存放,中间文件存放,输出文件存放,主函数文件存放
在**Function**中创建这样两个文件:**Add.c Sub.c**,分别输出两个数的和和差。
在**SourceCode**创建一个 **test.c**,里面添加函数声明,以及实例,不需要给出头文件,这些会在库的创建中被代替对应的作用
静态库
一. 将所有的函数编译为中间文件:
gcc -c ./Function/Add.c -o ./Media/Add.o
gcc -c ./Function/Sub.c -o ./Media/Sub.o
二. 使用 ar 命令打包所有的中间文件
ar -cr ./Lib/libtest.a Add.o Sub.o
其中 libtest.a 是我自己命名的静态库文件名
要删除库文件中某个函数,使用 **-d 你要删除的中间文件**
要添加的话,使用 -rs 参数用法和删除的参数相同
例如:ar -d Add.o
ar -rs Add.o
三. 链接
gcc -c ./SourceCode/atest.c -o ./Media/atest.o
这是将主函数文件编译为中间文件,有利于后面的对接
gcc ./Media/atest.o -L./Lib -ltest -o ./Outfile/atest.out
其中 -L 指定库文件所在根目录,-l 指定库文件的名称,我的库文件原名是 **libtest.a**,但在该参数后面变成了 **test** ,去除了前面的 **lib** 和后面的 **.a**,这是另一个需要注意的地方。
四. 运行
./Outfile/atest.out 即可得出结果
动态库
一. 创建可以重定位函数地址的中间文件
gcc -c -fpic ./Function/Add.c -o ./Media/Add.o
gcc -c -fpic ./Function/Sub.c -o ./Media/Sub.o
这里的参数 -fpic 就是给予中间文件函数重定位的能力
二. 将这些中间文件连接成一个动态库
gcc -shared ./Media/Add.o ./Media/Sub.o -o ./Lib/libsotest.so
参数 -shared 就起到这个作用,后面的**libsotest.so**是我命名的动态库文件名
三. 使用动态链接库
gcc ./SourceCode/atest.c -s ./Lib/libsotest.so -o ./Outfile/sotest.out
动态库使用时不需要把主函数文件编译为中间文件,参数 -s 是使用该库文件;
四. 执行
./Outfile/sotest.out
但是如果这样直接执行,会发生错误,原因是加载共享库(动态库)的时候,找不到它,
因为系统默认从根目录下的 **/lib** 去寻找,然后再用用户的 **LD_LIBRARY_PATH**变量值下去寻找,这时,我们应当更改该变量的值:
export LD_LIBRARY_PATH=./Lib/
完成之后你运行 echo 指令可以看到:
**echo $LD_LIBRARY_PATH
./Lib/**
此时你就可以直接运行 ./Outfile/sotest.out 结果会正常出现
但是这是一个临时的办法,当用户重新登录的时候,又会出现问题,要解决他,在用户的加目录中 输入 ll -a 命令,可以看到有一个
-rw-r--r--. 1 wad wad 343 1月 20 02:44 **.bashrc** 文件,编辑它,在里面加上这样的一句话:export LD_LIBRARY_PATH=/home/wad/Lib 就可以永久生效
其中 wad 是用户的家目录名。