linux下靜態庫的生成和使用

2021-09-08 08:36:10 字數 1942 閱讀 2314

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.乙個事例:

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

#include#includeintmain()

如果直接使用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」     //注意include該檔案,並不是僅鏈入.a檔案即可

int main(void)

b.tiger.**件中的內容:

#ifndef __tiger__

#define __tiger__

int add(int a,intb); #endif

c.tiger.c檔案中的內容

int  add(int  a,intb)

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

gcc  -o tiger.o  -c  tiger.c

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

ar  -rcs libadd.a  tiger.o    

其次使用靜態庫

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

gcc  -o  main main.c  libadd.a

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

gcc  -o  main  main.c -ladd

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

cannot  find –ladd

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

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

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

原文:

posted @

2018-12-20 16:48

小時候挺菜 閱讀(

...)

編輯收藏

Linux下靜態庫生成和使用

1.庫是預編譯的目標檔案 object files 的集合,它們可以被鏈結程序式。靜態庫以後綴為 a 的特殊的存檔 archive file 儲存。2.標準系統庫可在目錄 usr lib與 lib中找到。比如,在類unix系統中c語言的數序庫一般儲存為檔案 usr lib libm.a。該庫中函式的...

Linux系統下靜態庫的生成和使用

一 庫 一組預先編譯好的函式的集合,這些函式都是按照可重用的原則編寫的。通由一組相互關聯的函式組成以執行某項常見的任務。二 庫檔案的名字命名規範 以lib開頭,隨後的部分指明是什麼庫 c代表c語言庫,m代表數學庫 檔名的最後部分以.開始,最後給出庫檔案的型別。a代表傳統的靜態函式庫 so代表共享函式...

linux下靜態庫與共享庫的生成和使用

1 區別 靜態庫 應用程式直接從靜態庫中將函式複製到二進位制映象檔案中使用。以.a為字尾 eg libtest.a 共享庫 可執行檔案在執行時將 從共享庫檔案中讀出,間接引用。命名 lib so.x.x eg libtest.so.1.0 後面1.0為版本號 2 靜態庫生成 ar 引數 靜態庫名 目...