1. 所谓静态链接库,说白了就是在你把写好的代码编译的时候,就把你引用的库一起给编进去了,从此后你编出来的执行程序跟外面都不再有任何关系,即使这个库更新了,你也搭不上边儿。
其次,如果系统中许多类似的程序都需要用到这个库,那么各自在编译的时候都需要把这个库给编进去,浪费存储空间(加载到内存 里应该也是浪费内存空间的)。
linux系统中静态库的名字一般叫xxx.a, 所以如果看到一个以 .a结束的文件那么它就是一个静态链接库文件。
.a 文件实际上是多个.o(汇编生成的机器码文件)文件使用ar命令打包起来的,仅仅是为了方便使用,抛开.a 直接使用.o也是一样的。
2. 上代码,看看静态库是如何被编译出来以及如何被使用的
首先写一个sum.c,如下,很简单,里面只有一个Sum函数,把两个数相加的和返回
int Sum(int Number1, int Number2) { return Number1 + Number2; }
然后,写一个声明它的sum.h
int Sum(int Number1, int Number2);
最后,写主函数
#include<stdio.h> #include<sum.h> void main() { int Num1 = 1; int Num2 = 2; int iRet = 0; iRet = Sum(Num1, Num2); printf("Num1 + Num2 = %d.", iRet); return; }
3. 编译静态库,打开终端后用vim写代码
lv@lenovo: $ ls main.c sum.c sum.h lv@lenovo: $ gcc -c sum.c lv@lenovo: $ ls main.c sum.c sum.h sum.o lv@lenovo: $ lv@lenovo: $ lv@lenovo: $ ar cr libsum.a sum.o lv@lenovo: $ ls libsum.a main.c sum.c sum.h sum.o lv@lenovo: $
其中ar命令解释如下
ar rv libtest.a hello.o hello1.o
生成一个库,库名字是test,链接时可以用-ltest链接。该库中存放了两个模块hello.o和hello1.o。选项前可以有‘-'字符,也可以没有
编译主程序并运行:
lv@lenovo: $ gcc -o sumappd main.c -L . -lsum lv@lenovo: $ ls libsum.a main.o sum.h sumappd main.c sum.c sum.o lv@lenovo: $ ./sumappd Num1 + Num2 = 3
“-L .”指明了当前lib所在的路径是在本目录,-l表示链接libsum.a这个lib库。