最近搞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...