靜態庫和動態庫
編寫簡單的add/sub/mul/div函式,並打包成動/靜態庫,並分別使用
1.靜態庫(.a):程式在編譯的連結的時候把庫的程式碼連結到可執行檔案中。程式執行的時候不再需要靜態庫,以.a結尾
優點:可移植性較強,程式編譯成功,就不需要靜態庫了
缺點:每個程式都需要把靜態庫的程式碼連結進去,所以會浪費空間
2.動態庫(.so):程式在執行的時候才去連結動態庫的程式碼,多個程式共享使用庫的程式碼,以.so結尾
優點:動態庫可以在多個程式間共享,所以動態連結使得可執行檔案變小,節約了磁碟空間。
缺點:一旦庫丟失,用到他的程式都會崩潰
在widows下,靜態庫位.lib 動態庫為.dll
靜態庫生成:
//add.h #ifndef __ADD_H__ #define __ADD_H__ int add(int a,int b); #endif /// __ADD_H__ //add.c #include "add.h" int add(int a,int b) { return a + b; } //sub.h #ifndef __SUB_H__ #define __SUB_H__ int sub(int a,int b); #endif /// __SUB_H //sub.c #include "sub.h" int sub(int a,int b) { return a - b; } //mul.h #ifndef __MUL_H__ #define __MUL_H__ int mul(int a,int b); #endif /// __MUL_H //mul.c #include "mul.h" int mul(int a,int b) { return a * b; } //div.h #ifndef __DIV_H__ #define __DIV_H__ int div(int a,int b); #endif /// __DIV_H //div.c #include "div.h" int div(int a,int b) { return a/b; }
首先把上面的.c檔案搞成.o檔案,也就是生成二進位制檔案。
可以使用下面的方法
gcc -o add.c -o add.o
gcc -o sub.c -o sub.o
gcc -o mul.c -o mul.o
gcc -o div.c -o div.o
我們發現有了二進位制.o檔案
然後就可以生成靜態庫,用下面的命令
ar -rc libmymath.a *.o
libmymath.a是生成的靜態庫
ar是gnu歸檔工具
rc則表示replace和create
*.o 表示所有的.o檔案
當然也可以使用Makefile來生成靜態庫
同樣有了靜態庫,現在要測試靜態庫
main.c
#include <stdio.h>
#include "add.h"
#include "sub.h"
#include "mul.h"
#include "div.h"
int main()
{
int a=10;
int b=5;
printf(" %d + %d = %d\n",a,b,add(a,b));
printf(" %d - %d = %d\n",a,b,sub(a,b));
printf(" %d * %d = %d\n",a,b,mul(a,b));
printf(" %d / %d = %d\n",a,b,div(a,b));
}
編譯的指令是
gcc main.c -L. -lmymath
-L 指定庫路徑
-l 指定庫名,就是把libmymath.a刪掉字尾,lib改成l。
我們發現編譯之後,生成可執行檔案,然後執行,測試正確
這樣就是一個靜態庫的生成了
動態庫生成:
首先寫好.c檔案
然後生成.o檔案(二進位制檔案)
gcc -fPIC -c sub.c add.c mul.c div.c
fPIC:產生位置無關碼,動態庫要求PIC碼已達到動態連結的目的,否則,無法完成動態連結
然後生成動態庫
gcc -shared -o libmymath.so *.o
shared:表示生成動態庫的格式
然後執行
l:連結動態庫,只要庫名即可(去掉lib以及版本號)
L:連結庫所在的路路徑
1.拷貝.so檔案到系統共享路徑下,一般指/usr/lib
2.更改LD_LIBRARY_PATH
至此,動態庫就生成了