linux下生成,使用靜態和動態鏈接庫

當要使用靜態的程序庫時,連接器會找出程序所需的函數,然後將它們拷貝到執行文件,由於這種拷貝是完整的,所以一旦連接成功,靜態程序庫也就不再需要了。 然而,對動態庫而言,就不是這樣。動態庫會在執行程序內留下一個標記‘指明當程序執行時,首先必須載入這個庫。由於動態庫節省空間,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

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