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

2021-06-01 00:21:44 字數 1400 閱讀 3812

當要使用靜態的程式庫時,聯結器會找出程式所需的函式,然後將它們拷貝到執行檔案,由於這種拷貝是完整的,所以一旦連線成功,靜態程式庫也就不再需要了。 然而,對動態庫而言,就不是這樣。動態庫會在執行程式內留下乙個標記『指明當程式執行時,首先必須載入這個庫。由於動態庫節省空間,linux下進行連線 的預設操作是首先連線動態庫,也就是說,如果同時存在靜態和動態庫,不特別指定的話,將與動態庫相連線。

//檔案h.h

#ifndef _h_h_

#define _h_h_

void myprint();

#endif

//檔案h.c

#include

void myprint()

//檔案test.c

#include"h.h"   //表示先在當前目錄下找該標頭檔案,若沒有再在系統指定的目錄下找

#include//直接在系統指定的目錄下找該標頭檔案

int main()

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

LInux下生成靜態庫和動態庫

靜態庫與動態庫生成例項 linux下庫 編譯引數分析 靜態庫動態庫 在編譯過程中已經被載入可執行程式,所以體積較大 在可執行程式執行時才載入記憶體,在編譯過程中只是簡單的引用,所以 體積較小 準備好測試工作,寫好測試 test.h test.c main.c ifndef test h define...

Linux下生成動態庫和靜態庫

最近搞linux的程式設計 寫寫這個 綜合網上例子和本人使用方法。編輯得到舉例的程式 hello.h hello.c和main.c hello.h 見程式1 為該函式庫的標頭檔案。hello.c 見程式2 是函式庫的源程式,其中包含公用函式hello,該函式將在螢幕上輸出 hello main.c ...

LINUX下生成動 靜態庫檔案

1.生成.so檔案的命令 linux系統中的動態鏈結庫檔案 a g test a.cpp test b.cpp fpic shared o libtest.so g test.cpp o test l.ltestb 生成 gcc fpic shared port.cpp print.cpp o pr...