小白學Linxu之靜態庫生成和使用

2021-08-26 11:00:26 字數 1767 閱讀 1110

1.庫是預編譯的目標檔案(object files)的集合,它們可以被鏈結程序式。靜態庫以後綴為」.a」的特殊的存檔(archive file)儲存。

2.標準系統庫可在目錄/usr/lib與/lib中找到。比如,在類unix系統中c語言的數序庫一般儲存為檔案/usr/lib/libm.a。該庫中函式的原型宣告在標頭檔案/usr/include/math.h中。

3.c標準庫本身儲存為/usr/lib/libc.a,它包含ans1/iso標準指定的函式,比如printf。對每乙個c程式來說,libc.a都預設被鏈結。

4.乙個事例:

在程式中呼叫乙個數序庫libm.a中sin函式。

#include

#include

int main()

如果直接使用gcc tiger.c則會出現錯誤:

undefined reference to 『sin』;

1>函式sin(),未在本程式中定義也不在預設庫』libc.a』中,除非被指定,編譯器也不會鏈結』libm.a』。

2>為使編譯器能將sin()鏈結進主程式『test.c』,需要提供數學庫』libm.a』.。

3>使用方法:

gcc tiger.c/usr/lib/libm.a -o tiger

gcc tiger.c-lm –o tiger

1.靜態庫是obj檔案的乙個集合,通常靜態庫以」.a」為字尾。靜態庫由程式ar生成。

2.靜態庫的優點是可以在不用重新編譯程式庫**的情況下,進行程式的重新鏈結,這種方法節省了編譯過程的時間(在編譯大型程式的時候,需要花費很長的時間)。靜態庫的另乙個優點是開發者可以提供庫檔案給使用的人員,不用開放源**,這是庫函式提供者經常採用的手段。

3.通過乙個例項來了解如何自己生成靜態庫和使用靜態庫

首先生成靜態庫

1>在test資料夾下有三個檔案:main.c ,tiger.c,tiger.h;

a. main.c檔案中的內容:

#include

#include」tiger.h」

int main(void)

b.tiger.h檔案中的內容:

#ifndef__tiger__

#define__tiger__

int add(int a,intb);

#endif

c.tiger.c檔案中的內容

int add(int a,intb)

2>建立靜態庫的最基本步驟是生成目標檔案tiger.o

gcc -otiger.o -c tiger.c

3>然後生成靜態庫libadd.a:

ar -rcslibadd.a tiger.o

其次使用靜態庫

1>使用gcc命令帶上庫檔案就ok了

gcc -o mainmain.c libadd.a

2> 也可以使用命令」-l庫名」進行,庫名是不包含庫函式庫和副檔名的字串。

gcc -o main main.c-ladd

上面的命令執行完後,系統返回:

cannot find –ladd

說明:上面的命令將在系統預設的路徑西安查詢add函式庫,並把他鏈結到要生成的目標程式上。系統提示沒有找到庫檔案add,這是由於add庫函式沒有在系統預設的查詢路徑下,我們需要認為指定庫函式的路徑,例如:庫檔案和當前編譯檔案在同一目錄下:

gcc -omain main.c-l ./ -ladd

系統就能正常生成可執行檔案。

說明:在使用-l選項時,-o選項的目的名要在-l鏈結的庫名之前,否則gcc會認為-l是生成的目標而出錯。

linux庫引入之動態庫靜態庫(生成和使用)

庫 庫是一種可執行 的二進位制形式,可以被作業系統載入記憶體執行。就是將源 轉化為二進位制格式的源 相當於進行了加密,別人可以使用庫,但是看不到庫中的內容。如何使用 使用者需要同時具有標頭檔案和庫。標頭檔案 相當於說明書的作用,能夠知道這個庫能幹嘛 製作出來的庫 具體的實現,存放.c cpp 靜態庫...

linux庫引入之動態庫靜態庫(生成和使用)

庫 庫是一種可執行 的二進位制形式,可以被作業系統載入記憶體執行。就是將源 轉化為二進位制格式的源 相當於進行了加密,別人可以使用庫,但是看不到庫中的內容。如何使用 使用者需要同時具有標頭檔案和庫。標頭檔案 相當於說明書的作用,能夠知道這個庫能幹嘛 製作出來的庫 具體的實現,存放.c cpp 靜態庫...

如何生成靜態庫和動態庫

對於乙個編譯型語言,編譯器工作時總要經過預處理 編譯 鏈結等幾個過程。以 c c 為例 預處理器 cpp 將每個 c cpp 檔案中 include 的標頭檔案都合併到 c cpp 檔案中,並且對其進行巨集擴充套件,由此生成數個編譯單元。一般來說每個 c cpp 檔案對應乙個編譯單元。隨後,編譯器 ...