使用 .a 静态库和 .so 动态库

Source

1.先创建一个目录

mkdir test
cd test 

在这里插入图片描述
2.然后使用vim编辑器编辑生成sub1.c,sub2.c,main1.c
sub1.c代码

extern float x2x(int a,int b) 
{
    
      
return (float)a/b; //相除
}

sub2.c代码

extern float x2y(int a,int b) 
{
    
      
return (float)a*b; 
}

main1.c代码

#include "sub1.c"
#include "sub2.c"
#include <stdio.h>
int main() {
    
      
int x,y;
scanf("%d%d",&x,&y);
printf("%5f\n",x2x(x,y));
printf("%5f\n",x2y(x,y));
return 0; }

在这里插入图片描述

在这里插入图片描述

3.将 sub1.c、sub2.c 、main1.c编译成 .o文件

gcc -c sub1.c sub2.c main1.c

在这里插入图片描述
4.将x2x、x2y目标文件用 ar工具生成1个 .a 静态库文件

ar crv libafile.a sub1.o sub2.o

在这里插入图片描述
在这里插入图片描述

5.用 gcc将 main函数的目标文件与此静态库文件进行链接

gcc main1.c libafile.a -o main1

在这里插入图片描述

在这里插入图片描述
使用情况

6.记录文件的大小

size main1

在这里插入图片描述
7.将x2x、x2y目标文件用 ar工具生成1个 .so 动态库文件
生成目标文件(xxx.o)

gcc -c -fpic sub1.c sub2.c

o文件创建动态库

gcc -shared -fPIC -o libsub.so sub1.o sub2.o

在这里插入图片描述

8.使用动态库

gcc main1.c libsub.so -o main2
sudo mv libsub.so /usr/lib

在这里插入图片描述

9.记录大小

a904352517@ubuntu:~/test$ size main1
   text	   data	    bss	    dec	    hex	filename
   1986	    616	      8	   2610	    a32	main1
a904352517@ubuntu:~/test$ size main2
   text	   data	    bss	    dec	    hex	filename
   2317	    651      8	   2872	    b65	main2

大小对比