Linux 靜態庫生成及呼叫

Tom是隻狗發表於2020-11-27

  • 靜態庫 Static library
  • 靜態庫是obj檔案的一個集合,通常靜態庫以”.a”為字尾。
  • 標準系統庫可在目錄/usr/lib與/lib中找到。比如,在類Unix系統中C語言的數序庫一般儲存為檔案/usr/lib/libm.a。該庫中函式的原型宣告在標頭檔案/usr/include/math.h中。
  • C標準庫本身儲存為/usr/lib/libc.a,它包含ANS1/ISO標準指定的函式,比如printf。對每一個C程式來說,libc.a都預設被連結。
  • 靜態庫的一個優點是開發者可以提供庫檔案給使用的人員,不用開放原始碼,這是庫函式提供者經常採用的手段。
  • $@目標檔案
  • $^所有的依賴檔案
  • $<第一個依賴檔案
  • ar命令可以用來建立、修改庫,也可以從庫中提出單個模組。
  • 庫是一單獨的檔案,裡面包含了按照特定的結構組織起來的其它的一些檔案(稱做此庫檔案的member)。原始檔案的內容、模式、時間戳、屬主、組等屬性都保留在庫檔案中。

1 編寫原始檔及makefile,生成靜態庫

編寫一個測試原始檔tom.c,再編寫makefile,make過程分為兩步, 第一步生成.o檔案,第二步通過ar生成靜態庫。
在這裡插入圖片描述
在這裡插入圖片描述

2 編寫介面檔案(xx.h)

為了讓使用者知道我們的動態庫中有哪些介面可用,我們需要編寫對應的標頭檔案。
在這裡插入圖片描述

3 連結動態庫生成可執行檔案

如果同一目錄下同時存在同名的動態庫和靜態庫,比如 libmax.so 和 libmax.a 都在當前路徑下,則gcc會優先連結動態庫。

建立一個使用tom_add函式的test.c,makefile中的gcc -o $@ $< -L ./ -ltom生成a.out,其中-ltom表示要連結libmax.a。-L.表示搜尋要連結的庫檔案時包含當前路徑。
在這裡插入圖片描述

4 執行(無需指定動態庫位置)

直接執行 ./a.out 。
在這裡插入圖片描述

在嵌入式linux中使用動態庫(拿移遠CEFI舉例)

  1. 把makefile中的gcc更換成移遠的交叉編譯工具鏈arm-oe-linux-gnueabi-gcc
  2. openinit後make生成libtom.a
  3. 再make test生成a.out
  4. 將a.out拷入K18中,執行./a.out
    在這裡插入圖片描述

相關文章