當要使用靜態的程序庫時,連接器會找出程序所需的函數,然後將它們拷貝到執行文件,由於這種拷貝是完整的,所以一旦連接成功,靜態程序庫也就不再需要了。 然而,對動態庫而言,就不是這樣。動態庫會在執行程序內留下一個標記‘指明當程序執行時,首先必須載入這個庫。由於動態庫節省空間,linux下進行連接 的缺省操作是首先連接動態庫,也就是說,如果同時存在靜態和動態庫,不特別指定的話,將與動態庫相連接。
//文件h.h
#ifndef _h_h_
#define _h_h_
void myprint();
#endif
//文件h.c
#include<stdio.h>
void myprint()
{
printf("o,my sweety!n");
}
//文件test.c
#include"h.h" //表示先在當前目錄下找該頭文件,若沒有再在系統指定的目錄下找
#include<stdio.h> //直接在系統指定的目錄下找該頭文件
int main()
{
myprint();
exit(0);
}
1.生成靜態鏈接庫
gcc -c h.c -o h.o
ar cqs libh.a h.o
//ar是生成庫的命令,cqs是參數,libh.a是生成的靜態鏈接庫須以lib開頭,h是庫名,a表示是靜態鏈接庫,h.o是剛纔生成目標文件
2.生成動態鏈接庫
gcc -c h.c -o h.o
生成動態鏈接庫用gcc來完成
gcc -shared -WI -o libh.so h.o
//-shared -WI是參數,libh.so是生成的靜態鏈接庫須以lib開頭,h是庫名,so表示是動態鏈接庫,h.o是剛纔生成目標文件
3.將生成的libh.a,libh.so拷貝到/usr/lib或/lib下
4.編譯帶靜態鏈接庫的程序
gcc -c test.c -o test.o
gcc test.o -o test -WI -Bstatic -lh
//-WI -Bstatic表示鏈接靜態庫,-lh中-l表示鏈接,h是庫名即/usr/lib下的libh.a
5.編譯帶動態鏈接庫的程序
gcc -c test.c -o test.o
gcc test.o -o test -WI -Bdynamic -lh
//-WI -Bdynamic表示鏈接動態庫,-lh中-l表示鏈接,h是庫名即/usr/lib下的libh.so
6.運行./test得到結果
7.其他知識
有些庫形如libh.so.1.0,1.0表示版本號.若要使用該庫,通常要建立一個軟連接,用ln -s libh.so.1.0 libh.so.系統不知道1.0爲何意思。
編譯連接時同時要用動態和靜態鏈接庫,則用如下命令
gcc test.o -o test -WI -Bstatic -lh1 -WI -Bdynamic –lh2