Linux中的靜態庫和共享庫

2021-10-23 21:55:25 字數 4945 閱讀 9946

一、庫的概念

二、靜態庫

2.1 靜態庫的特點

程式中包含**,執行時不再需要靜態庫

程式執行時無需載入庫,執行速度更快

占用更多磁碟和空間

靜態庫公升級後,程式需要重新編譯鏈結

2.2 靜態庫的建立及鏈結

第一步:確定庫中函式的功能、介面

第二步:編寫庫原始碼

/****hello.c****/

#include

#include

"hello.h"

void

hello

(void

)

/****hello.h****/

#ifndef _hello_h_

#define _hello_h_

void

hello

(void);

#endif

第三步:編譯生成目標檔案

linux@linux:

~/andy/lib$ ls

hello.c hello.h

linux@linux:

~/andy/lib$ gcc -c hello.c -wall

linux@linux:

~/andy/lib$ ls

hello.c hello.h hello.o

第四步:建立靜態庫

linux@linux:

~/andy/lib$ ls

hello.c hello.h hello.o

linux@linux:

~/andy/lib$ ar crs libhello.a hello.o //使用 ar crs 命令建立靜態庫

linux@linux:

~/andy/lib$ ls

hello.c hello.h hello.o libhello.a //注意libhello.a是庫檔名,hello是庫名

linux@linux:

~/andy/lib$ nm libhello.a //使用 nm 命令可檢視庫中符號資訊

hello.o:

00000000 t hello

u puts

第五步:編寫應用程式

/****test.c****/

#include

#include

"hello.h"

intmain

(int argc,

const

char

*ar**)

linux@linux:

~/andy/lib$ ls

hello.c hello.h hello.o libhello.a test.c

linux@linux:

~/andy/lib$ gcc -o test test.c -l.

-lhello //使用-l. -l+庫名 鏈結靜態庫

linux@linux:

~/andy/lib$ ls

hello.c hello.h hello.o libhello.a test test.c

linux@linux:

~/andy/lib$ .

/test

hello andyxi

由於使用的是靜態庫,編譯後相關**已經複製到可執行檔案中。刪除靜態庫,不影響程式執行

linux@linux:

~/andy/lib$ ls

hello.c hello.h hello.o libhello.a test test.c

linux@linux:

~/andy/lib$ rm libhello.a

linux@linux:

~/andy/lib$ ls

hello.c hello.h hello.o test test.c

linux@linux:

~/andy/lib$ .

/test

hello andyxi

三、共享庫

3.1 共享庫的特點

程式不包含庫中**,尺寸小

多個程式可共享乙個庫

程式執行時需要載入庫

庫公升級方便,無需重新編譯程式

使用更加廣泛

3.2 共享庫的建立及鏈結

第一步:確定庫中函式的功能、介面

第二步:編寫庫原始碼

/****hello.c****/

#include

void

hello

(void

)

/****bye.c****/

#include

void

bye(

void

)

/****共享庫標頭檔案common.h****/

#ifndef __common_h__

#define __common_h__

void

hello

(void);

void

bye(

void);

#endif

第三步:編譯生成目標檔案

linux@linux:

~/andy/lib/share$ ls

bye.c common.h hello.c

linux@linux:

~/andy/lib/share$ gcc -c -fpic *

.c -wall

linux@linux:

~/andy/lib/share$ ls

bye.c bye.o common.h hello.c hello.o

第四步:建立共享庫common

linux@linux:

~/andy/lib/share$ gcc -shared -o libcommon.so.

1 hello.o bye.o

linux@linux:

~/andy/lib/share$ ls

bye.c bye.o common.h hello.c hello.o libcommon.so.

1

第五步:編寫應用程式

/****test.c****/

#include

#include

"common.h"

intmain

(int argc,

const

char

*ar**)

/****為共享庫檔案建立鏈結檔案****/

linux@linux:

~/andy/lib/share$ ls

bye.c bye.o common.h hello.c hello.o libcommon.so.

1 test.c

linux@linux:

~/andy/lib/share$ ln -s libcommon.so.

1 libcommon.so //ln -s建立符號鏈結

linux@linux:

~/andy/lib/share$ ls

bye.c bye.o common.h hello.c hello.o libcommon.so libcommon.so.

1 test.c

/****編譯應用程式並鏈結共享庫****/

linux@linux:

~/andy/lib/share$ gcc -o test test.c -l.

-lcommon

linux@linux-:~

/andy/lib/share$ ls

bye.c bye.o common.h hello.c hello.o libcommon.so libcommon.so.

1 test test.c

3.3 共享庫的載入
此時執行程式,會報錯

linux@linux:

~/andy/lib/share$ .

/test

./test: error while loading shared libraries: libcommon.so: cannot open shared object file: no such file or directory

第七步:載入共享庫並執行程式

linux@linux:

~/andy/lib/share$ export ld_library_path=$ld_library_path:

.linux@linux:

~/andy/lib/share$ .

/test

hello world

bye!

3.4 如何找到共享庫

為了讓系統能找到要載入的共享庫,通常由三種方法:

Linux基礎 靜態庫和共享庫

概念 庫檔案就是目標檔案的集合,可以被其它 呼叫,把 封裝成庫檔案後方便使用 方便管理 安全性高 保密性強。靜態庫和共享庫輔助工具 ldd 檢視可執行程式依賴那些共享庫 nm 檢視目標檔案 可執行檔案 靜態庫 共享庫中的符號列表 strip 刪除目標檔案 可執行檔案 靜態庫 共享庫中的符號。objd...

靜態庫和共享庫

建立和使用靜態庫 1 建立目錄 mkdir p test sub 2 在子目錄sub 下編寫hello.c和hello.h hello.c include include hello.h void hello hello.h include void hello 4 在主目錄test 下編寫main...

Linux 靜態庫與共享庫

可以把 多個編譯好的目標檔案 打包成為乙個檔案,就是庫檔案。庫檔案有兩種 靜態庫 a 和共享庫 so 靜態庫和共享庫區別 靜態庫是 函式的歸檔,在使用時,複製函式的 區到最終的檔案中。共享庫是 函式的歸檔,在使用時,把函式在共享庫中的位址拿到最終的檔案中。靜態庫的效率稍高一點,但占用空間非常大,而且...