Linux下生成動態庫和靜態庫

2021-05-25 07:19:03 字數 2380 閱讀 3418

最近搞linux的程式設計··· 寫寫這個

綜合網上例子和本人使用方法。

編輯得到舉例的程式--hello.h、hello.c和main.c;

hello.h(見程式1)為該函式庫的標頭檔案。

hello.c(見程式2)是函式庫的源程式,其中包含公用函式hello,該函式將在螢幕上輸出"hello ***!"。

main.c(見程式3)為測試庫檔案的主程式,在主程式中呼叫了公用函式hello。

靜態庫在程式編譯時會被連線到目標**中,程式執行時將不再需要該靜態庫。

動態庫在程式編譯時並不會被連線到目標**中,而是在程式執行是才被載入,因此在程式執行時還需要動態庫存在。

root@mydebian:/home/michael/cppproject/libtest# gcc -shared -fpic -o libmyhello.so hello.c

root@mydebian:/home/michael/cppproject/libtest# gcc -o t main.c ./libmyhello.so

root@mydebian:/home/michael/cppproject/libtest# ./t

hello everyone!

-fpic 使輸出的物件模組是按照可重定位位址方式生成的。

-shared指定把對應的原始檔生成對應的動態鏈結庫檔案。

root@mydebian:/home/michael/cppproject/libtest# cp libmyhello.so /usr/lib/

root@mydebian:/home/michael/cppproject/libtest# gcc -o t main.c -lmyhello

root@mydebian:/home/michael/cppproject/libtest# ./t

hello everyone!

這裡,對於鏈結的方法作一下解釋。對於gcc -o t main.c -lmyhello中最後乙個引數-lmyhello, 可見傳給c編譯器的命令列引數並未提到函式庫的完整路徑名,甚至沒有提到在函式庫目錄中該檔案的完整名字!實際上,編譯器被告知根據選項-lmyhello鏈結到相應的函式庫(/usr/lib下),函式庫的名字是libmyhello.so, 也就是說,"lib"部分和檔案的副檔名被省略了,但在前面加了乙個l。

root@mydebian:/home/michael/cppproject/libtest# gcc -c hello.c

root@mydebian:/home/michael/cppproject/libtest# ls

hello.c  hello.h  hello.o  main.c

root@mydebian:/home/michael/cppproject/libtest# ar -cr libmyhello.a hello.o

root@mydebian:/home/michael/cppproject/libtest# ls

hello.c  hello.h  hello.o  libmyhello.a  main.c

root@mydebian:/home/michael/cppproject/libtest# gcc -o t main.c libmyhello.a

root@mydebian:/home/michael/cppproject/libtest# ./t

hello everyone!

若將libmyhello.a複製到/usr/lib目錄下,將命令換成gcc –o t main.c –lmyhello即可。

root@mydebian:/home/michael/cppproject/libtest# mv libmyhello.a /usr/lib/

root@mydebian:/home/michael/cppproject/libtest# ls

hello.c  hello.h  hello.o  main.c

root@mydebian:/home/michael/cppproject/libtest# gcc -o t main.c -lmyhello

root@mydebian:/home/michael/cppproject/libtest# ./t

hello everyone!

root@mydebian:/home/michael/cppproject/libtest# ls

hello.c  hello.h  hello.o  libmyhello.a  main.c  t

root@mydebian:/home/michael/cppproject/libtest# rm libmyhello.a

root@mydebian:/home/michael/cppproject/libtest# ./t

hello everyone!

LInux下生成靜態庫和動態庫

靜態庫與動態庫生成例項 linux下庫 編譯引數分析 靜態庫動態庫 在編譯過程中已經被載入可執行程式,所以體積較大 在可執行程式執行時才載入記憶體,在編譯過程中只是簡單的引用,所以 體積較小 準備好測試工作,寫好測試 test.h test.c main.c ifndef test h define...

linux下動態庫和靜態庫生成

有時候需要把一組 編譯成乙個庫,這個庫在很多專案中都要用到,例如libc就是這樣乙個庫,我們在不同的程式中都會用到libc中的庫函式 例如printf 也會用到libc中的變數 例如以後 要講到的environ變數 本文將介紹怎麼建立這樣乙個庫。這些檔案的目錄結構是 tree main.c stac...

Linux動態庫和靜態庫基礎

example hello.c hello.h main.c 1.靜態庫 gcc c hello.c ar cr libhello.a hello.o 引用庫 lhello 2.動態庫 gcc c hello.c gcc shared fpci o libhello.so hello.o 引用庫 l...