Linux下靜態庫與動態庫的使用
Linux下有靜態鏈接庫和動態鏈接庫兩種,靜態鏈接庫的後綴名是.a,動態鏈接庫的後綴名是.so,下面詳細介紹:
靜態鏈接庫:
靜態鏈接庫是指程序在編譯鏈接的過程中就把依賴的庫插入到程序中,這樣程序的運行就不需要這些庫的支持,但缺點是文件變大,下面以一個例子介紹如何製作靜態鏈接庫:
有add.c和mul.c兩個文件,分別實現兩數相加與相乘:
add.c:
int my_add(int num1, int num2)
{
return num1 + num2;
}
mul.c:
int my_mul(int num1, int num2)
{
return num1 * num2;
}
還有一個computer.h頭文件,聲明瞭上面兩個函數:
int my_add(int num1, int num2);
int my_mul(int num1, int num2);
還有一個main.c文件調用這兩個函數:
#include <stdio.h>
#include "compute.h"
int main()
{
int a=3, b=5;
printf("%d + %d = %d\n", a, b, my_add(a, b));
printf("%d * %d = %d\n", a, b, my_mul(a, b));
return 0;
}
gcc -o add.a -c add.c -static
gcc -o mul.a -c mul.c -static
ar -rc libcompute.a add.a mul.a
上面首先把add.c和mul.c編譯成兩個獨立的.a文件,然後把他們合併成一個靜態鏈接庫libcompute.a(當然你也可以把它們做成兩個靜態鏈接庫,連接main的時候指定這兩個就可以了)。static表示編譯成靜態鏈接庫。ar是一個打包命令。
現在靜態鏈接庫libcompute.a做好了,下面我們把它插入到main.c中:
gcc -o main main.c -lcompute -L.
上面的-lcomputer表示要鏈接的靜態鏈接庫是libcomputer.a,-L.表示在當前目錄下尋找。
爲了方便,我們把上面的命令寫在一個Makefile裏:
Makefile:
all:
gcc -o main main.c -lcompute -L.
lib:
gcc -o add.a -c add.c -static
gcc -o mul.a -c mul.c -static
ar -rc libcompute.a add.a mul.a
clean:
rm -f *.o *.a main
首先:make lib 生成靜態鏈接庫
然後:make 生成最終的main可執行文件
這樣就可以了,運行main,正確輸出結果了:
3 + 5 = 8
3 * 5 = 15
Makefile:
all:
gcc -o main main.c -ladd -lmul -L.
lib:
gcc -o libadd.a -c add.c -static
gcc -o libmul.a -c mul.c -static
clean:
rm -f *.o *.a main
當然爲了簡便,我們可以只運行一個命令就搞定所有的事情:
Makefile:
all: lib
gcc -o main main.c -lcompute -L.
lib:
gcc -o add.a -c add.c -static
gcc -o mul.a -c mul.c -static
ar -rc libcompute.a add.a mul.a
clean:
rm -f *.o *.a main
只要一個make命令就搞定了~~動態鏈接庫:
完成!