本文主要講解了靜態庫和動態庫的生成,以及.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...