静态链接库与动态链接库 (一)静态链接库的编译与使用

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库。

原文地址:https://www.cnblogs.com/lvchaoshun/p/5966212.html