亚洲韩日午夜视频,欧美日韩在线精品一区二区三区,韩国超清无码一区二区三区,亚洲国产成人影院播放,久草新在线,在线看片AV色

您好,歡迎來到思海網絡,我們將竭誠為您提供優質的服務! 誠征網絡推廣 | 網站備案 | 幫助中心 | 軟件下載 | 購買流程 | 付款方式 | 聯系我們 [ 會員登錄/注冊 ]
促銷推廣
客服中心
業務咨詢
有事點擊這里…  531199185
有事點擊這里…  61352289
點擊這里給我發消息  81721488
有事點擊這里…  376585780
有事點擊這里…  872642803
有事點擊這里…  459248018
有事點擊這里…  61352288
有事點擊這里…  380791050
技術支持
有事點擊這里…  714236853
有事點擊這里…  719304487
有事點擊這里…  1208894568
有事點擊這里…  61352289
在線客服
有事點擊這里…  531199185
有事點擊這里…  61352288
有事點擊這里…  983054746
有事點擊這里…  893984210
當前位置:首頁 >> 技術文章 >> 文章瀏覽
技術文章

Linux系統下 連接器ld鏈接順序

添加時間:2016-3-4 21:39:55  添加: 思海網絡 
  原來ld對于鏈接一系列的庫的順序是很敏感的,不然會報undefined referenced 的函數符號錯誤,意思就是未找到函數定義。實際上庫是能正確打開的。如果庫libA.a依賴于庫libB.a,那么連接器的參數應該ln -lA -lB,   必須這樣寫。不然就會錯誤。

  這個看來是歷史的遺留問題。說白了就是,如果你確定某個庫不重要,就放到最后,也就是說,庫的加載順序是按順序進行的,從左到右,優先級最高,這也是遠古時代機器太破的原因,內在和硬盤包括CPU都是極其稀罕珍貴的。所以要你提前搞定哪些需要哪些不需要,一旦需要,就加載上去,不需要就不要加載上去。這樣就可以解釋上面的錯誤了,編譯器加載到socketcomm后,發現還有依賴庫,再往后找,木有咧,于是就錯了。

  也就是說,被依賴的盡量放到后面,讓大家可以共用。

  這就引申同來了另外一個問題,如果有多個庫,使用了相同的函數名或者類名,結構體名稱會怎么樣?

  可以使用nm和readelf、ldd等命令來查看你的庫的依賴和符號表以及導出的函數符號等。這樣就可以來驗證上面的因為順序造成的不同的編譯結果。

  把測試的庫分成動、動;靜、靜;動靜三種情況。

  第一種情況:靜靜庫都包含有相同的名字函數




代碼如下:  gcc -L./ main.c -lA -lB
  編譯報錯,在multiple definition of `XXX‘。重復定義函數。

  第二種情況:動動庫

  這個得看加載的順序,上面說過,從左開始,按需加載。




代碼如下:  gcc main.c ./libB.so ./libA.so



代碼如下:  gcc main.c ./libA.so ./libB.so
  這樣的鏈接方式為隱式鏈接,或者說加載時鏈接,而前面的靜態庫為編譯時連接。

  也就是說,編譯的順序確定到底調用哪個庫中的同名函數。

  第三種情況:動動,但是是動態加載,而不上面的靜態加載。




代碼如下:  gcc main.c -ldl ./libA.so ./libB.so



代碼如下:  gcc main.c -ldl ./libB.so ./libA.so
  沒有加鏈接選項時,跟第二種情況一樣。加了L選項后,指定哪上加載哪個。

  libB為靜態鏈接!, libA為動態加載.




代碼如下:  gcc -L./ main.c -ldl –lB
  動態庫的庫名顯示的加載入編譯選項中




代碼如下:  gcc -L./ main.c -ldl -lB ./libA.so



代碼如下:  gcc -L./ main.c -ldl ./libA.so -lB
  在有靜態和動態時,不把動態庫庫名顯示加入編譯選項,輸出是正常的,如果加進去以靜態庫為主和link順序無關。


關鍵字:Linux、系統、連接器
分享到:

頂部 】 【 關閉
版權所有:佛山思海電腦網絡有限公司 ©1998-2024 All Rights Reserved.
聯系電話:(0757)22630313、22633833
中華人民共和國增值電信業務經營許可證: 粵B1.B2-20030321 備案號:粵B2-20030321-1
網站公安備案編號:44060602000007 交互式欄目專項備案編號:200303DD003  
察察 工商 網安 舉報有獎  警警  手機打開網站