靜態庫 a和動態庫 so檔案的生成和使用

2021-10-24 20:22:00 字數 4499 閱讀 9177

本文主要講解了靜態庫和動態庫的生成,以及.o檔案和.so檔案的使用。

hello.**件:

#ifndef hello_h

#define hello_h

void

hello

(const

char

*name)

;#endif

//hello_h

hello.c

#include

void

hello

(const

char

*name)

main.c

#include

"hello.h"

intmain()

將hello.c編譯成為.o檔案

gcc -c hello.c
生成後結果:

由.o 檔案建立靜態庫

生成.o檔案,命令列:

ar -crv libhyhello.a hello.o
建立靜態庫成功:

使用靜態庫

使用靜態庫有3中方法,三種方法所用語句不同,但是執行結果相同。

方法一:

gcc -o hello main.c -l. –lhyhello
方法二:

gcc main.c libhyhello.a -o hello
方法三:

gcc -c main.c

gcc -o hello main.o libmyhello.a

我們刪除靜態庫檔案試試公用函式hello 是否真的連線到目標檔案hello 中了。若刪除了靜態庫仍可以執行,則表明連線到目標檔案hello中。

由.o檔案生成動態庫

生成.so檔案,命令列:

gcc -o hello main.c -l.

-lhyhello

回到根目錄下,將檔案複製到 /usr/lib 中,在執行hello,不然會報錯:

cp libmyhello.so /usr/lib
輸出結果如下圖所示:

gcc命令相同時,會先執行.a檔案,還是會先執行.so檔案?

先刪除除.c和.**件外的所有檔案,然後再編譯形成.o檔案,生成.o檔案後,再由.o檔案分別生成.a檔案和.so檔案。執行程式後,發現當靜態庫和動態庫同名時,gcc 命令將優先使用動態庫,預設去連/usr/lib 和/lib 等目錄中的動態庫。

a1.c

#include

void

print1

(int arg)

a2.c

#include 

void

print2

(char

*arg)

a.h

#ifndef a_h

#define a_h

void

print1

(int);

void

print2

(char*)

;#endif

test.c

#include

#include

"a.h"

intmain()

將a1.c和a2.c都生成目標檔案

gcc -o a1.c a2.c
生成靜態庫.a檔案

ar crv libhyfile.a a1.o a2.o
使用.a檔案建立可執行.exe檔案

gcc -o test test.c libhyfile.a

./test

執行結果如下圖所示:

生成目標檔案

gcc -c -fpic a1.c a2.c
生成共享庫.so檔案

gcc -shared *

.o -o libhysofile.so

sudo cp libhysofile.so /usr/lib

gcc -o test test.c libhysofile.so

./test

執行結果如下圖所示:

靜態庫的簡單應用

編寫三個檔案,分別是main.c、sub1.c和sub2.c檔案,檔案內容分別為:

//main

#include

void

main()

//sub1

#include

float

x2x(

int a,

int b)

//sub2

#include

float

x2y(

int a,

int b)

將三個檔案編譯成為.o檔案:

gcc -c main.c sub1.c sub2.c
將sub1.c和sub2.c的目標檔案生成乙個.a靜態庫檔案:

動態庫的簡單應用

將sub1.o和sub2.o的目標檔案生成乙個.so動態庫檔案:

比較.o檔案和.so檔案的大小

比較可以看出,靜態庫的檔案較大一些。

①當直接輸入命令

gcc -shared -fpic -o libhyhello.so hello.o
會出現如下圖的錯誤:

此時,需要先輸入命令:

gcc -fpic -c main.c -o hello.o
再輸入上方命令。

②rm 直接刪除檔案

當只是用rm 時,不會出現提示語句,使用rm -i 之後,會詢問你是否刪除檔案。

通過本次學習,基本上掌握了靜態庫和動態庫的建立和使用方法,在此過程中,遇到了很多的困難,但是都是可以通過查資料了解到的,所以並不是不可能解決的問題。

參考1參考2

生成靜態庫 a檔案和動態庫 so檔案

靜態庫在linux環境中,使用ar命令建立靜態庫檔案.如下是命令的選項 d 從指定的靜態庫檔案中刪除檔案 m 把檔案移動到指定的靜態庫檔案中 p 把靜態庫檔案中指定的檔案輸出到標準輸出 q 快速地把檔案追加到靜態庫檔案中 r 把檔案插入到靜態庫檔案中 t 顯示靜態庫檔案中檔案的列表 x 從靜態庫檔案...

靜態庫 a和動態庫 so生成及呼叫

gcc編譯器工具一般位於 usr bin或者 usr local bin目錄,但它會從其它位置執行各種編譯器支援的應用程式,這個位置可能是 usr lib gcc lib 目錄,gnu c c 編譯器的各個工具和gnu專用標頭檔案都儲存在這裡。標頭檔案,一般位於 usr include,包含標頭檔案...

Linux生成動態庫 so與生成靜態庫 a

動態庫共享庫 第一步 通過gcc fpic c 編譯生成.o檔案 gcc fpic c a.c 編譯生成.o檔案 fpic與位置無關 gcc fpic c b.c 生成a.o,b.o編譯檔案。第二步 通過上面已經生成的a.o,b.o檔案生成.so檔案 方法1 gcc shared wl o liba...