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