Linux下静态库与动态库的使用

来源:互联网 发布:叮叮软件下载 编辑:程序博客网 时间:2024/05/16 02:02

Linux下静态库与动态库的使用


Linux下有静态链接库和动态链接库两种,静态链接库的后缀名是.a,动态链接库的后缀名是.so,下面详细介绍:



静态链接库:

静态链接库是指程序在编译链接的过程中就把依赖的库插入到程序中,这样程序的运行就不需要这些库的支持,但缺点是文件变大,下面以一个例子介绍如何制作静态链接库:


有add.c和mul.c两个文件,分别实现两数相加与相乘:

add.c:

[cpp] view plaincopyprint?
  1. int my_add(int num1, int num2)  
  2. {  
  3.   return num1 + num2;  
  4. }  

mul.c:

[cpp] view plaincopyprint?
  1. int my_mul(int num1, int num2)  
  2. {  
  3.   return num1 * num2;  
  4. }  


还有一个computer.h头文件,声明了上面两个函数:

[cpp] view plaincopyprint?
  1. int my_add(int num1, int num2);  
  2. int my_mul(int num1, int num2);  

还有一个main.c文件调用这两个函数:

[cpp] view plaincopyprint?
  1. #include <stdio.h>  
  2. #include "compute.h"  
  3.   
  4. int main()  
  5. {  
  6.   int a=3, b=5;  
  7.   
  8.   printf("%d + %d = %d\n", a, b, my_add(a, b));  
  9.   printf("%d * %d = %d\n", a, b, my_mul(a, b));  
  10.   
  11.   return 0;  
  12. }  



因此,整个例子有4个文件。现在我们把add.cmul.c编译成静态链接库:

[plain] view plaincopyprint?
  1. gcc -o add.a -c add.c -static  
  2. gcc -o mul.a -c mul.c -static  
  3. ar -rc libcompute.a add.a mul.a  
上面首先把add.c和mul.c编译成两个独立的.a文件,然后把他们合并成一个静态链接库libcompute.a(当然你也可以把它们做成两个静态链接库,连接main的时候指定这两个就可以了)。static表示编译成静态链接库。ar是一个打包命令。


现在静态链接库libcompute.a做好了,下面我们把它插入到main.c中:

[plain] view plaincopyprint?
  1. gcc -o main main.c -lcompute -L.  
上面的-lcomputer表示要链接的静态链接库是libcomputer.a,-L.表示在当前目录下寻找。

为了方便,我们把上面的命令写在一个Makefile里:

Makefile:

[plain] view plaincopyprint?
  1. all:  
  2.     gcc -o main main.c -lcompute -L.  
  3.   
  4. lib:  
  5.     gcc -o add.a -c add.c -static  
  6.     gcc -o mul.a -c mul.c -static  
  7.     ar -rc libcompute.a add.a mul.a  
  8.   
  9. clean:  
  10.     rm -f *.o *.a main  

首先:make lib       生成静态链接库

然后:make            生成最终的main可执行文件


这样就可以了,运行main,正确输出结果了:

[plain] view plaincopyprint?
  1. 3 + 5 = 8  
  2. 3 * 5 = 15  


前面说过,可以不把add.o和mul.o合成一个静态链接库,下面给出的是这种方法的Makefile:

Makefile:

[plain] view plaincopyprint?
  1. all:  
  2.     gcc -o main main.c -ladd -lmul -L.  
  3.   
  4. lib:  
  5.     gcc -o libadd.a -c add.c -static  
  6.     gcc -o libmul.a -c mul.c -static  
  7.   
  8. clean:  
  9.     rm -f *.o *.a main  


当然为了简便,我们可以只运行一个命令就搞定所有的事情:

Makefile:

[plain] view plaincopyprint?
  1. all: lib  
  2.     gcc -o main main.c -lcompute -L.  
  3.   
  4. lib:  
  5.     gcc -o add.a -c add.c -static  
  6.     gcc -o mul.a -c mul.c -static  
  7.     ar -rc libcompute.a add.a mul.a  
  8.   
  9. clean:  
  10.     rm -f *.o *.a main  
只要一个make命令就搞定了~~



动态链接库:









完成!

来源:http://blog.csdn.net/htttw/article/details/7269485