一、庫的概念
二、靜態庫
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 靜態庫和共享庫區別 靜態庫是 函式的歸檔,在使用時,複製函式的 區到最終的檔案中。共享庫是 函式的歸檔,在使用時,把函式在共享庫中的位址拿到最終的檔案中。靜態庫的效率稍高一點,但占用空間非常大,而且...