動態庫
動態鏈結庫是程式執行時載入的庫,當動態鏈結庫正確安裝後,所有的程式都可以使用動態庫來執行程式。動態鏈結庫是目標檔案的集合。
動態鏈結庫的名稱有別名,真名和鏈結名。別名由乙個字首lib,然後是庫的名字,再加上乙個字尾「.so」構成。真名是動態鏈結庫的真實名稱,一般總是在別名的基礎上加上乙個小版本號。除此之外,還有乙個鏈結名,即程式鏈結時使用的庫的名字。
1.生成動態鏈結庫
操作和上面的靜態庫的前兩步驟是一致的
步驟五:由.o檔案建立動態庫檔案
生成動態鏈結庫的命令很簡單,使用-fpic選項或者-fpic選項,動態庫檔名命名規範和靜態庫檔名命名規範類似,也是在動態庫名增加字首lib,但其擴充套件名為.so,我們建立的動態庫名為libmyhello.so,則動態庫檔名就是libmyhello.so,用gcc來建立動態庫。
gcc -fpic -c hello.c
lshello.c hello.h hello.o main.c
gcc -shared -fpic -o libmuhello.so hello.o
lshello.c hello.h hello.o libmyhello.so main.c
或者gcc -shared -fpic -o libmyhello.so hello.c
lshello.c hello.h libmyhello.so main.c
步驟六:在程式中使用動態庫
在程式中使用動態庫和靜態庫完全一樣,也是在使用到這些公用函式的源程式中包含這些公用函式的原型宣告,然後在用gcc命令生成目標檔案時指明動態庫名進行編譯。先執行gcc命令生成目標檔案,再執行看看結果
gcc -o hello main.c libmyhello.so
./hello
./hello: error while loading shared libraries: libmyhello.so: cannot open shared object file: no such file or directory
會出錯,是因為找不到動態庫檔案libmyhello.so,程式在執行時,會在/usr/lib和/lib等目錄中查詢需要的動態庫檔案。若找到,則載入動態庫,否則將提示錯誤而終止程式執行我們將檔案libmyhello.so複製到/usr/lib中。
mv libmyhello.so/usr/lib
./hello
hello everyone!
說明了動態庫在程式執行時是需要的。
當靜態庫和動態庫同名時,gcc命令優先使用動態庫
Linux之動態鏈結庫
動態鏈結庫的名字形式為 lib so 字首是 lib,字尾名為 so l 針對於實際庫檔案,每個共享庫都有個特殊的名字 soname 在程式啟動後,程式通過這個名字來告訴動態載入器該載入哪個共享庫。l 在檔案系統中,soname 僅是乙個鏈結到實際動態庫的鏈結。對於動態庫而言,每個庫實際上都有另乙個...
linux編譯動態庫之fPIC
在生成動態庫時,常常習慣性的加上fpic選項,fpic有什麼作用和意義,加不加有什麼區別,這裡做下小結 fpic的全稱是 position independent code,用於生成位置無關 什麼是位置無關 個人理解是 無絕對跳轉,跳轉都為相對跳轉。1 不加fpic選項 即使不加fpic也可以生成....
Linux學習筆記 動態庫的生成
庫分為兩種 1 共享庫 shared library 2 靜態庫 static library 通常共享庫也稱為動態庫。使用g 命令來生成動態庫編譯,生成.o檔案 編譯選項 fpic g c fpic example.cpp o example.o 鏈結,生成目標 so檔案 鏈結選項 shared ...