庫有兩種,一種是靜態鏈結庫,一種是動態鏈結庫,不管是哪一種庫,要使用它們,都要在程式中包含相應的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靜態庫和動態庫
我們通常把一些公用函式製作成函式庫,供其它程式使用。函式庫分為靜態庫和動態庫兩種。靜態庫在程式編譯時會被連線到目標 中,程式執行時將不再需要該靜態庫。動態庫在程式編譯時並不會被連線到目標 中,而是在程式執行是才被載入,因此在程式執行時還需要動態庫存在。靜態庫 是在可執行程式執行之前就已經加入到執行 ...