linux學習-1簡析靜態庫與動態庫的區別與聯系
1簡介
我們知道從源代碼到可執行程序的轉換需要經歷編譯、匯編以及鏈接,或者可以簡單的理解成2步,編譯和鏈接。通過編譯,可以將每個源文件生成一個目標文件(即.c/.cpp -> .o文件)
2靜態庫與動態庫
首先什么是庫文件呢?庫文件是就是一種可執行代碼的二進制格式,可以被載入到內存中執行,具體可以分為靜態庫文件以及動態庫文件,二者同時存在同名文件,優先調用動態庫文件。
2.1靜態庫
(1)命名方式:靜態庫即.a文件,一般命名為lib+庫名.a。
(2)特點:由于靜態庫文件包含所有數據以及函數因此靜態庫文件比較大。正因如此,其可以脫離源文件執行,即刪除相關C文件之后仍可執行,實際上作用于目標文件(.o).
(3)載入時刻:編譯的時候直接別嵌入到可執行文件中。
(4)生成指令:可略有不同
ar?-rc?libxxx.a?xxx.o
2.2動態庫:
(1)命名方式:動態庫即.so文件,一般命名為lib+庫名.so。
(2)特點:動態庫相比靜態庫要小很多,但其依賴源文件,一旦刪除源文件將無法執行
(3)載入時刻:可執行程序運行時才被載入內存。
(4)生成指令
gcc?-fPIC?-shared?xxx.c?-o?libxxx.so,其中-fPIC?指的是位置無關即載入時重定位
(5)注意:調用時注意其路徑,一般在linux默認生成在usr/lib下
3 gcc常用選項列表
(1) -c :只編譯,不鏈接,生成目標文件“.o”。
(2) -S :只編譯,不匯編,生成匯編代碼”.s”。
(3) -E :只進行預編譯。
(4) -o file:把輸出文件輸出到file里。
(5) -o0 不進行優化處理、-o或-o1優化生成代碼
(6) -shared 生成共享目標文件,通常構建動態庫
(7) -g :在可執行程序中包含標準調試信息。
(8) -v :打印出編譯器內部編譯各過程的命令行信息和編譯器的版本。
(9) -I dir :在頭文件的搜索路徑列表中添加dir目錄
(10)-L dir :在庫文件的搜索路徑列表中添加dir目錄
(11)-static :連接靜態庫(靜態庫也可以用動態庫鏈接方式鏈接)
(12)-llibrary :連接名為library的庫文件
選項以及警告等更加詳細的內容參考https://blog.csdn.net/gatieme/article/details/21389603
Linux 匯編語言
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。