Linux下靜態庫與動態庫的使用

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;
}



因此,整個例子有4個文件。現在我們把add.cmul.c編譯成靜態鏈接庫:

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


前面說過,可以不把add.o和mul.o合成一個靜態鏈接庫,下面給出的是這種方法的Makefile:

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命令就搞定了~~



動態鏈接庫:









完成!









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章