一.動態庫和靜態庫的定義
1.靜態庫
????程序在編譯鏈接時把庫的代碼鏈接到可執行文件中。程序運行時就不再需要靜態庫
2.動態庫
????程序在運行的時候才去鏈接動態庫的代碼,多個程序 共享使用代碼
3.動態鏈接
????在執行文件之前,外部函數的機器碼由操作系統從磁盤上的該動態庫中復制到內存中,這個過程就叫做動態鏈接。其中動態庫可以在多個程序間共享,使用動態鏈接使得可執行文件更小,節省了磁盤空間。操作系統采用虛擬內存機制允許物理內存中的一份動態庫被要用到該庫的所有進程公用,節省了內存和磁盤空間。
二.如何生成一個靜態庫
????1.先來看一組代碼
//add.c
#include<stdio.h>
#include"add.h"int add(int a, int b)
{return a + b;
}
//add.h
#ifndef __ADD_H__
#define __ADD_H__int add(int a ,int b);#endif //__ADD_H__#ifndef __ADD_H__
#define __ADD_H__int add(int a ,int b);#endif //__ADD_H__
//sub.c
#include<stdio.h>
#include"sub.h"int sub(int a, int b)
{return a - b;
}
//sub.h
#ifndef __SUB_H__
#define __SUB_H__int sub(int a ,int b);#endif //__SUB_H__
//main.c
#include<stdio.h>
#include"add.h"
#include"sub.h"int main()
{int a = 10;int b = 30;printf("add(%d, %d) = %d\n", a, b, add(a, b));printf("sub(%d, %d) = %d\n", a, b, sub(a, b));return 0;
}
????經過編譯生成.o文件
????????
????通過ar(gnu)歸檔文具,rc表示代替和創建)生成靜態庫
????????????????
????其中ar后的-ty中t代表列出靜態庫的文件,v代表詳細信息
????運行靜態庫:
????此時將靜態庫刪掉,程序照樣可以執行
?
????注意:-L選項是指定庫的路徑(這里是當前目錄所在路徑),-l是指定庫名(這里是mymath),靜態庫是以.a結尾,在使用ar -rc 命令中應該注意以下幾點
????????????????
三.如何生成一個靜態庫
????1.生成動態庫
?
????2.運行動態庫
?
????3.使用外部庫
//test.c 文件
#include<stdio.h>
#include<math.h>int main()
{double x = pow(2.0, 3.0);printf("The cubed is %f\n", x);return 0;
}