目录
一、了解静态库及动态库
二、链接静态库编译
1、编写源程序
2、静态文件库libx2.a的编译
1)编译.o目标文件
2)编译libx2.a静态库文件
3、链接为可执行文件main
三、编译时链接动态库文件
1、编译动态库文件libx2.so
2、链接为可执行文件
四、心得体会
五 、参考文献
一、了解静态库及动态库
函数库分为静态库和动态库两种。
- 静态库在程序编译时会被链接到目标代码中,程序运行时将不再需要该静态库。
- 动态库在程序编译时并不会被链接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。
二、链接静态库编译
1、编写源程序
main.c(主函数):
#include"sub1.h" #include"sub2.h" #includeint main() { int x=2,y=9,n; //定义x和y变量 printf("%d/%d=%.2fn",y,x,x2x(x,y)); //输出处理后的值,保留两位小数 printf("请输入斐波那契的第n项值:"); scanf("%d",&n); printf("斐波那契数列第%d项为%dn",n,x2y(n)); //输出斐波那契数列的第n项 return 0; }
sub1.h
#ifndef __SUB1_H #define __SUB1_H float x2x(int a,int b); //计算b除以a #endif
sub1.c
#include "sub1.h"
float x2x(int a,int b)
{
float ans;
ans=(float)b/a;
return ans;
}
sub2.h
#ifndef __SUB2_H #define __SUB2_H int x2y(int); //计算斐波那契数列的第n项值 #endif
sub2.c
#include "sub2.h"
int x2y(int n)
{
int a=1,b=1,i;
long c=0;
if(n<3) return 1;
else
{
for(i=0;i<=n-3;i++)
{
c=a+b;
a=b;
b=c;
}
return c;
}
}
2、静态文件库libx2.a的编译
1)编译.o目标文件
输入以下命令
gcc -c main.c sub1.c sub2.c
可以编译得到main.o、sub1.o、sub2.o三个目标文件
2)编译libx2.a静态库文件
使用如下命令编译生成libx2.a静态库文件。
ar -crv libx2.a sub1.o sub2.o
3、链接为可执行文件main
使用下面的命令链接main.o和libx2.a文件生成可执行文件main
gcc main.o libx2.a -o main
使用下面的命令执行该可执行文件:
./main
测试是否真的静态库链接成功,删除静态库libx2.a目标文件,再次执行该可执行文件 :
以上说明静态库链接生成的可执行文件运行时不需要该静态库,因为该静态库已经被编译到可执行文件中了。
三、编译时链接动态库文件
1、编译动态库文件libx2.so
.o目标文件已经在上面编译静态库文件时生成了,因此这里直接编译动态库文件。
使用下面的命令编译生成动态库文件libx2.so
gcc -shared -fPIC -o libx2.so sub1.o sub2.o
2、链接为可执行文件
输入如下命令:
sudo mv libx2.so /usr/lib
程序在运行时, 会在/usr/lib 和/lib 等目录中查找需要的动态库文件。若找到,则载入动态库,否则将提示类似上述错误而终止程序运行,所以如果不输入上述指令程序将会报错!!!
再输入如下命令链接两个目标文件生成可执行文件main
gcc main.o libx2.so -o main
使用下面的命令查看main可执行文件的依赖项:
ldd main
四、心得体会
通过操作,让我对库有了进一步的理解:动态库生成的可执行文件要比静态库生成的要更小,但是链接动态库需要依赖于该动态库以及静态库链接是直接在程序编译时就将其组装到一起,可以不依赖于静态库就能运行。而动态库链接是在程序运行时才将其载入内存运行且不能够缺少,否则不能运行。
五 、参考文献
gcc分别链接静态库和动态库生成可执行文件_不#曾&轻听的博客-CSDN博客



