動態庫和靜態庫

2021-10-06 16:11:28 字數 2822 閱讀 6999

庫是什麼:

1.通過gcc編譯器得到的

2.本質:

還是乙個檔案

這個檔案裡邊就是程式設計師編寫的**

3.為什麼要使用庫

**保密

為了部署和分發

100個原始檔-》打包成乙個庫   

4.如何使用庫

要有動態庫/靜態庫

來自於.c .cpp,裡面是若干個函式的實現

需要有標頭檔案宣告原始檔中實現的函式

有標頭檔案

裡面宣告了可被呼叫 的函式名,和引數

命名規則​​​​​​

靜態庫的製作

原始檔   -----    預編譯     ------ 編譯     ---------   彙編 -------- 目標檔案 .o     ------  使用ar工具編號壓縮打包 ------靜態庫

#ifndef _head_h

#define _head_h

int add (int a,int b);

int subtract(int a,int b);

int multiply(int a,int b);

double divide(int a,int b);

#endif

#  ls

1.通過gcc得到 .o 檔案 -c

add.c    div.c    head.h    main.c     mult.c     sub.c

# gcc -c add.c div.c mult.c sub.c

add.c add.o div.c div.o head.h mian.c mult.c mult.o sub.c sub.o

2.將得到的o 打包-> 使用 ar工具 (archive)

ar   rcs

-r :替換

-c :建立

-s :索引

ar rcs libcalc.a add.o div.o mult.o sub.o

靜態庫的分發

1.libcalc.a   2.標頭檔案:head.h

靜態庫的使用

1.根據標頭檔案中的api,編寫測試程式

2.編譯測試程式,指定靜態庫

目錄          檔案

|-----include      head.h

|----lib               main.c

|----src              add.c div.c mult.c sub.c

#gcc -c src/*.c  直接編譯找不到標頭檔案

#gcc -c src/*.c -i ./include/   ---------------    (-i)指定搜尋的檔案

gcc 指定靜態庫

- l :靜態庫的路徑

-l    :靜態庫的名字:去掉lib ,去掉.a ,剩下的是名字  libcalc.a  - >calc  

共享-》共享記憶體中的庫

命名規則

liunx : lib***x.so  和靜態庫差不多

在liunx下是乙個可執行檔案

window : lib***.dll  如果使用vs製作的 :lib***.lib   lib***.dll

動態庫的製作

原始檔  ----- 預編譯-e ----- 編譯 -s ----- 彙編 -c  ----目標檔案 al.o ------ (-shared)  ----- lib***.dll

1.使用gcc 得到 .o 

gcc sub.c add.c div.c mult.c -c -fpic

-fpic/-fpic: 使用相對位址記錄**位置

2.使用gcc 得到動態庫,以下兩種格式都可以

gcc -shared add.o sub.o div.o mult.o -o libcalc.so

gcc -shared -o libcalc.so add.o sub.o div.o mult.o

分發:標頭檔案,動態庫

使用:編寫測試檔案,對頭檔案中宣告的函式測試

include     head.h

lib libcalc.a

libcalc.so

mian.c

src add.c div.c mult.c sub.c

只是保證在連線的時候沒問題

工作原理:

- 靜態庫 :gcc 進行連線之後,靜態庫中的**和測試檔案**被打包到了可執行檔案中

- 動態庫:gcc進行連線之後,動態庫不會和可執行程式打包在一起

- 程式啟動之後,動態庫會被動態載入到記憶體中

- 什麼時候載入?程式需要呼叫add函式的時候,動態庫被載入到記憶體

#可以通過命令檢測是不是能載入到對應的庫檔案:

動態庫和靜態庫

本文主要解決以下幾個問題 1 為什麼要使用庫?2 庫的分類 3 建立自己的庫 或許大家對自己初學linux時的情形仍記憶尤新吧。如果沒有乙個能較好的解決依賴關係的包管理器,在linux下安裝軟體將是一件及其痛苦的工作。你裝a包時,可能會提示你要先裝b包,當你費盡心力找到b包時,可能又會提示你要先安裝...

動態庫和靜態庫

先抄一段 windows下的動態庫和靜態庫區別解釋,其實linux下意義一樣的,不過字尾名有些區別 靜態庫 在編譯的時候載入生成目標檔案,在執行時不用載入庫,在執行時對庫沒有依賴性。動態庫 在目標檔案執行時載入,手動載入,且對庫有依賴性。兩者區別 一,靜態庫的使用需要 1 包含乙個對應的標頭檔案告知...

動態庫和靜態庫

簡單的說,使用動態庫就是在鏈結的時候,不會將動態庫的 鏈結到可執行檔案中,而是採用symbol的方式。使用靜態庫,生成可執行檔案的時候,會將靜態庫的 鏈結到可執行檔案中。這樣,動態庫體積會很小,並且可以,依賴於更新的動態庫,但是,缺點是不穩定。靜態庫會更加穩定,但是體積會很大。靜態庫 就是多個目標檔...