1. 程式人生 > >linux下生成,使用靜態和動態連結庫

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