Linux 靜態庫和動態庫

2021-08-17 22:03:53 字數 2340 閱讀 9500

庫有兩種,一種是靜態鏈結庫,一種是動態鏈結庫,不管是哪一種庫,要使用它們,都要在程式中包含相應的include標頭檔案。我們先來回顧一下程式編譯的過程。如下圖:

庫:本質乙個目標檔案,這個檔案的字尾有兩種格式,對應兩種庫

缺點是:檔案太大。多次拷貝庫程式,不僅浪費空間,而且檔案體積大

下面實現乙個靜態庫檔案()

add.h

#pragma once

intadd( int a,int b);

sub.h

#pragma once

intsub( int a,int b);

add.c

#include "add.h"

int add( int a,int b)

sub.c

#include "sub.h"

int add( int a,int b)

main.c

#include 

#include "add.h"

#include "sub.h"

int main( )

makefile檔案

.phony:all

all:

add.o

sub.o

add.o:

add.c

gcc -c add

.c -o add

.osub.o:

sub.c

gcc -c sub

.c -o sub

.o.phony:clean

clean:

rm -f *.o

編寫好上述**後按照以下做法即可實現乙個靜態庫

第一步:生成目標檔案

執行make,生成目標檔案。由於靜態庫是在編譯鏈結的時候把庫的**鏈結到可執行檔案中去,生成*.o檔案是便於鏈結。

第二步:生成靜態庫

這裡靜態庫名前要以lib開頭,以.a結束

[zyc@localhost lib]$ ar -rc libmymath.a

add.o

sub.o

第三步:檢視靜態庫中的目錄列表

[zyc@localhost lib]$ ar -tv libmymath.a

rw-rw-r-- 500/500

1240 mar 30

00:49

2018

add.o

rw-rw-r-- 500/500

1240 mar 30

00:49

2018

sub.o

第四步:測試目標檔案

測試時去掉靜態庫名字首lib和.a字尾

[zyc@localhost lib]$ gcc main.c -l. -lmymath

[zyc@localhost lib]$ ls

add.c

add.h

add.o a.out libmymath.a main.c makefile sub

.csub

.hsub

.o[zyc@localhost lib]$ ./a.out

add( a,b)=20

sub( a,b)=20

測試目標檔案生成後,即使刪除靜態庫,程式依然可以執行。

[zyc@localhost lib]$ rm libmymath.a

[zyc@localhost lib]$ ls

add.c

add.h

add.o a.out main.c makefile sub

.csub

.hsub

.o[zyc@localhost lib]$ ./a.out

add( a,b)=20

sub( a,b)=20

以上就是自己打造的靜態庫。

下面來看動態庫的打造

由於動態庫暫時執行不出來,先不放動態庫程式了,後續更新

linux 靜態庫和動態庫

1.生成方式 靜態庫 首先將原始檔編譯成目標檔案 gcc c test.c o test.o 然後生成靜態庫 ar rc libstatic.a test.o 共享庫 首先將原始檔編譯成目標檔案 gcc c test.c o test.o 生成共享庫 gcc fpic shared o libsha...

Linux 靜態庫和動態庫

我們指定c程式從 到乙個可執行程式需要經過預處理 編譯 彙編 鏈結。而最後一步鏈結又分為動態鏈結與靜態鏈結。靜態鏈結相當於就是講所要鏈結的庫提前放入鏈結的檔案,這樣子的檔案體積較大,但是可移植性較高。而動態鏈結是在執行的時候才去主動鏈結所需要鏈結的庫,這樣的 體積較小,多個程式共同使用庫的 我們li...

linux靜態庫和動態庫

我們通常把一些公用函式製作成函式庫,供其它程式使用。函式庫分為靜態庫和動態庫兩種。靜態庫在程式編譯時會被連線到目標 中,程式執行時將不再需要該靜態庫。動態庫在程式編譯時並不會被連線到目標 中,而是在程式執行是才被載入,因此在程式執行時還需要動態庫存在。靜態庫 是在可執行程式執行之前就已經加入到執行 ...