so檔案:動態庫
a檔案: 靜態庫
exe檔案:可執行程式(linux下以檔案屬性來標示是否是可執行檔案,與字尾名無關)
經過自己寫的一些測試程式,大致了解了下gcc中鏈結順序問題,總結出以下幾點:
1,動態庫中可以包含另乙個靜態庫,通過引數 -l*** 把靜態庫lib***.a加入so檔案中,這樣so檔案中
就包含了lib***.a的所有實現。當然,如果不包含lib***.a也沒有問題,這樣生成的so會小一點。
如果不包含lib***.a,最終使用這個so的可執行檔案,在其生成時必須加入 -l***。
2, 2個so檔案可以包含同乙個靜態庫lib***.a,最終生成exe檔案時,不會產生衝突。更廣泛的說,生成
exe檔案時候,可以鏈結多個so檔案和a檔案,如果其中的a檔案有多份實現,最終只會有乙份生效,其他都會被忽略。不用擔心衝突。
3,當生成exe時候,當a檔案有多份實現時,最左邊指定的a檔案才生效。
具體例子來說:
libstatic.a : 乙個靜態庫檔案
libdynamic1.so:需要使用libstatic.a中的函式,但是沒有包含libstatic.a
libdynamic2.so:需要使用libstatic.a中的函式,包含libstatic.a
libdynamic3.so:需要使用libstatic.a中的函式,也包含libstatic.a
test.exe:最終的生成的可執行檔案(linux對字尾沒有要求,為了說明檔案,姑且用exe字尾來表示可執行檔案)
gcc -o test.exe -ldynamic1 :錯誤,libdynamic1.so中沒有包含libstatic.a,找不到libstatic.a的實現。
gcc -o test.exe -ldynamic1 -lstatic:正確,so中沒有,但是指定了libstatic.a,可以編譯過
gcc -o test.exe -ldynamic2 :正確,libdynamic2.so中有libstatic.a的實現。
gcc -o test.exe -ldynamic1 -ldynamic2:正確,libdynamic1.so中沒有libstatic.a,但是libdynamic2.so中有。
gcc -o test.exe -ldynamic2 -ldynamic3:正確,雖然libdynamic2.so和libdynamic3.so都含有靜態庫,但是不會衝突, 最終只會有乙份存在,並且是libdynamic2.so中的靜態庫有效。
gcc -o test.exe -ldynamic2 -ldynamic3 -lstatic:同樣正確,最終只會有乙份存在,並且是libdynamic2.so中的靜態庫有效。
gcc中庫的鏈結順序是從右往左進行,所以要把最基礎實現的庫放在最後,這樣左邊的lib就可以呼叫右邊的lib中的**。同時,當乙個函式的實現**在多個lib都存在時,最左邊的lib**最後link,所以也將最終儲存下來。
0
給主人留下些什麼吧!~~
動態鏈結庫和靜態鏈結庫
函式和資料被編譯進乙個二進位制檔案 通常擴充套件名為.lib 在使用靜態庫的情況下,在編譯鏈結可執行檔案時,鏈結器從庫中複製這些函式和資料並把它們和應用程式的其它模組組合起來建立最終的可執行檔案 exe檔案 在使用動態鏈結庫的時候,往往提供兩個檔案 乙個引入庫和乙個dll。引入庫包含被dll匯出的函...
動態鏈結庫和靜態鏈結庫的區別
平時總聽人講動態鏈結庫 靜態鏈結庫 lib dll so等名詞,一直搞不清楚這幾者之間的區別以及各自的應用場合。後來上網仔細查了一下資料,終於搞清楚了,在這裡整理一下先。動態鏈結庫 動態鏈結庫中包含了多個已經被編譯 鏈結好的函式和資料資源,但並不包含函式的原始碼。動態鏈結庫在windows下是.dl...
動態鏈結庫和靜態鏈結庫的區別
本文我們學習和了解一下動態鏈結庫和靜態鏈結庫的區別。靜態鏈結庫 lib檔案 將函式 編譯到應用程式中,應用程式執行時全部載入到記憶體。優點是不需要掛在dll檔案,缺點是生成的應用程式比較大。動態鏈結庫 lib和dll檔案 lib編譯到應用程式中,實際函式 寫在dll中。在應用程式執行時,lib只是用...