gcc建立和使用靜態庫 動態庫

2021-08-22 19:32:07 字數 2205 閱讀 6052

gcc建立和使用靜態庫、動態庫

下面以工程libtest為例說明gcc

建立和使用

靜態庫、動態庫的過程,libtest目錄結構和內容如圖1所示,其中三個檔案hello.h,hello.c和main.c的內容如下。

libtest/include/hello.h

#ifdef _hello_h_

#define _hello_h_

void hello();

#endif

libtest/lib/hello.c

#include "hello.h"

#include

void hello()

libtest/src/main.c

#include "hello.h"

int main()

(1)      進入libtest/lib目錄,執行命令:

gcc -c -i../include hello.c

該命令生成目標檔案hello.o,注意:引數-i新增標頭檔案搜尋目錄,這裡因為hello.c中有#include 「hello.h」,hello.h在libtest/include目錄中,這裡需要指定該目錄通知gcc,否則出現錯誤提示「找不到標頭檔案hello.h」。

這一步將在libtest/lib目錄中生成乙個hello.o檔案。

(2)      在libtest/lib目錄,執行命令:

ar rc libhello.ahello.o

該命令將hello.o新增到靜態庫檔案libhello.a,ar命令就是用來建立、修改庫的,也可以從庫中提出單個模組,引數r表示在庫中插入或者替換模組,c表示建立乙個庫,關於ar命令的詳細使用規則可以參考文章

這一步將在libtest/lib目錄中生成乙個libhello.a檔案。

(3)      進入libtest/src目錄,執行命令:

gcc main.c-i../include -l../lib -lhello -o main

該命令將編譯main.c並鏈結靜態庫檔案libhello.a生成可執行檔案main,注意:引數-l新增庫檔案搜尋目錄,因為libhello.a在libtest/lib目錄中,這裡需要指定該目錄通知gcc,引數-l指定鏈結的庫檔名稱,名稱不用寫全名libhello.a,只用寫hello即可。

這一步將在libtest/src目錄中生成可執行檔案main。

(1)      進入libtest/lib目錄,執行命令:

gcc hello.c-i../include -fpic -shared -o libhello.so

這一步將在當前目錄生成動態庫檔案libhello.so,引數-fpic -shared固定格式,不用糾結他們什麼意思。

(2)      進入libtest/src目錄,執行命令:

gcc main.c-i../include -l../lib -lhello -o main

此時在當前目錄中已經生成了可執行檔案main,執行./main時卻提示錯誤:

./main: error while loading shared libraries: libhello.so: cannotopen shared object file: no such file or directory

也就是找不到動態庫檔案libhello.so,在網上找了答案說如果遇到這樣的問題需要設定環境變數ld_library_path,如下:

export ld_library_path=」../lib」

gcc main.c -i../include -l../lib -lhello -o main

然後再執行./main就沒有錯誤了。

【補充】

環境變數ld_library_path指示動態聯結器可以裝載動態庫的路徑,在鏈結動態庫檔案前設定該變數為庫檔案所在路徑,注意:用export ld_library_path=」…」方式只是臨時生效的,如果要永久有效可以寫入~/.bashrc檔案中,跟修改path類似,exportld_library_path=$ld_library_path:」…」。

當然如果有root許可權的話,也可以修改/etc/ld.so.conf檔案,將要新增的動態庫搜尋路徑寫入該檔案中,然後呼叫/sbin/ldconfig來達到同樣的目的。

本部落格還有另外一篇文章可參考:

gcc建立和使用靜態庫、動態庫

gcc建立和使用靜態庫 動態庫

下面以工程libtest為例說明gcc建立和使用靜態庫 動態庫的過程,libtest目錄結構和內容如圖1所示,其中三個檔案hello.h,hello.c和main.c的內容如下。圖1libtest include hello.h ifdef hello h define hello h void h...

靜態庫與動態庫的建立和使用

一 靜態庫的建立 1 gcc c 原始檔.c 產生.o檔案 ar rcs rcd 靜態庫名 libname.a 目標檔案1 目標檔案2 二 靜態庫的使用 2 gcc o file file.c l.lname ar t libname.a 列出庫中的目標檔案 ar d libname.a file....

靜態庫和動態庫的建立和使用

靜態庫 靜態庫是在程式執行之前就編譯到目標程式去了 優點 執行快 缺點 占用空間大 靜態庫的建立 生成xx.a檔案 1.gcc cal.c c 函式檔案 生成 o檔案 2.ar rcs libcalcul.a 需要生成的.a檔案 cal.o 一般用lib開頭,便於砍頭去尾 3.gcc calcula...