静态库与动态库的实现及makefile的编写

静态库(.a):程序在编译链接时将库的代码链接到可执行文件中。程序运行时将不再需要静态库。
缺点:文件会变大。
下面用一个例子来说明静态链接库:
有add.c、sub.c、mul.c、div.c文件,实现加减乘除。
add.h

#pragma once
int add(int a,int b);            

add.c

  1 #include"add.h"
  2 
  3 int add(int a,int b)
  4 {
  5         return a+b;
  6 }

sub.h

  1 #pragma once
  2 int sub(int a,int b);

sub.c

  1 #include"sub.h"
  2 
  3 int sub(int a,int b)
  4 {
  5         return a-b;
  6 }

mul.h

 #pragma once
 int mul(int a,int b);

mul.c

  1 #include"mul.h"
  2 
  3 int mul(int a,int b)
  4 {
  5         return a*b;
  6 }     

div.h

   #pragma once
   int div(int a,int b);

div.c

  1 #include"div.h"
  2 
  3 int div(int a,int b)
  4 {
  5         return a/b;
  6 }

main.c

  1 #include<stdio.h>
  2 #include"add.h"
  3 #include"sub.h"
  4 #include"mul.h"
  5 #include"div.h"
  6 
  7 int main()
  8 {
  9         int a=10;
 10         int b=5;
 11         printf("add(10,5)=%d\n",add(a,b));
 12 
 13         printf("sub(10,5)=%d\n",sub(a,b));
 14 
 15         printf("mul(10,5)=%d\n",mul(a,b));
 16         printf("div(10,5)=%d\n",div(a,b));
 17 }

下面将其编译成静态链接库:
makefile文件如下:

  1 main:main.c libmymath.a
  2         gcc main.c ./libmymath.a -o main
  3 libmymath.a:
  4         gcc -c add.c -o add.o 
  5         gcc -c sub.c -o sub.o
  6         gcc -c mul.c -o mul.o
  7         gcc -c div.c -o div.o
  8         ar -rc libmymath.a add.o sub.o mul.o div.o
  9 .PHONY:clean
 10 clean:
 11         rm main libmymath.a add.o  sub.o  mul.o  div.o

说明:将其合并成一个静态链接库libmymath.a, -L表示当前目录下寻找。
ar -rc libmymath.a add.o sub.o mul.o div.o是一个打包命令。

扫描二维码关注公众号,回复: 1076233 查看本文章

这里写图片描述

动态库(.so):程序在运行时候才去链接动态库的代码,多个程序共享使用库的代码。
动态链接:在可执行文件开始运行之前,外部函数的机器码由操作系统从磁盘上的动态库中复制到内存中,此过程为动态链接。
优点:动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省空间。

makefile的编写:

  1 main:main.c libmymath.so
  2         gcc main.c ./libmymath.so -o main
  3 libmymath.so:
  4         gcc -fPIC -c add.c sub.c mul.c div.c 
  5         gcc -shared -o libmymath.so *.o
  6 .PHONY:clean
  7 clean:
  8         rm main libmymath.so

说明:shared表示生成共享库格式。
-fPIC:产生位置无关码。
*.o:表示当前的所以.o文件。
结果显示:
这里写图片描述

file libmymath.so
libmymath.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, not stripped

linux下的动态库的类型为ELF类型。

猜你喜欢

转载自blog.csdn.net/xiaodu655/article/details/79809128
今日推荐