目录
一、库
1) 概念
2) 规则
二、编译时链接静态库文件
1) 源程序
2) 编译静态库文件libx2.a
3) 链接为可执行文件main
三、 编译时链接动态库文件
1)编译动态库文件libx2.so
2)链接为可执行文件
3)链接静态库与动态库生成可执行文件的对比
四、总结
五、 参考内容
一、库
1)概念
本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。一些公用函数制作成函数库,供其它程序使用。函数库分为静态库和动态库两种。
~ 静态库:在程序编译时会被链接到目标代码中,程序运行时将不再需要该静态库。
~动态库:在程序编译时并不会被链接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。
2)规则
- 静态库
- 静态库的名字一般为libxxx.a,其中xxx是该lib的名称。
- 动态库
- 动态库的名字一般为libxxx.so.major.minor,xxx是该lib的名称,major是主版本号, minor是副版本号。
1)源程序
① sub1.c
float x2x(int a,int b)
{
float c=0;
c=a+b;
return c;
}
② sub2.c
float x2y(int a,int b)
{
float c=0;
c=a/b;
return c;
}
③ sub.h
#ifndef SUB_H #define SUB_H float x2x(int a,int b); float x2y(int a,int b); #endif
④ main.c
#include#include"sub.h" void main() { int a,b; printf("Please input the value of a:"); scanf("%d",&a); printf("Please input the value of b:"); scanf("%d",&b); printf("a+b=%.2fn",x2x(a,b)); printf("a/b=%.2fn",x2y(a,b)); }
将这些代码文件放在同一个文件夹zuoye当中
2)编译静态库文件libx2.a
接下来,gcc编译得到.o文件
gcc -c sub1.c sub2.c main.c
创建静态库
工具: ar
ar -crv libx2.a sub1.o sub2.o
3) 链接为可执行文件main
使用以下命令链接main.o和libx2.a文件生成可执行文件main
gcc main.o libx2.a -o main
执行可执行文件main,可得最终结果
./main
测试是否真的静态库链接成功
删除静态库libx2.a目标文件,再次执行该可执行文件
rm libx2.a ll ./main
以上说明静态库链接生成的可执行文件运行时不需要该静态库,因为该静态库已经被编译到可执行文件中了。
三、 编译时链接动态库文件1) 编译动态库文件libx2.so
.o目标文件已经在上面编译静态库文件时生成了,因此这里直接编译动态库文件。
使用以下命令编译生成动态库文件libx2.so:
gcc -shared -fPIC -o libx2.so sub1.o sub2.o
2) 链接为可执行文件
使用以下命令链接两个目标文件生成可执行文件main
gcc main.o libx2.so -o main ll
执行文件时发现有错误,
原因:
程序在运行时, 会在/usr/lib 和/lib 等目录中查找需要的动态库文件。若找到,则载入动态库,否则将提示类似上述错误而终止程序运行。
解决方法:
将libx2.so 复制到目录/usr/lib 中,再次执行./main运行(若提示权限不够则以使用sudo mv libx2.so /usr/lib该命令)
3)链接静态库与动态库生成可执行文件的对比
首先,在使用两种不同类型的库生成可执行文件,并执行时,动态库执行过程中有一定的错误,相对麻烦,其次,静态库生成的可执行文件为7528字节,动态库生成的可执行文件为7492字节。从而可见动态库生成的可执行文件要比静态库生成的要更小,但是链接动态库需要依赖于该动态库。
四、总结通过此次关于使用静态库和动态库分别链接生成可执行文件main的实验,我了解到了不同库函数的链接的作用是不一样的。静态库链接是直接在程序编译时就将其组装到一起,可以不依赖于静态库就能运行;而动态库链接是在程序运行时才将其载入内存运行且不能够缺少,否则不能运行。总之,只用多加练习,才能更好的应用它们。文章如有不妥之处,请指出。
五、 参考内容(1条消息) gcc分别链接静态库和动态库生成可执行文件_不#曾&轻听的博客-CSDN博客
(1条消息) gcc生成静态库.a和动态库.so_Harriet的博客-CSDN博客



