求大神,linux下靜態庫鏈結的問題
有兩個檔案和乙個庫,a.c, b.c,libh.a,其中b.c裡面會有呼叫libh.a的函式func1,現在將a.c, b.c,libh.a編譯鏈結生成可執行檔案,有下面幾種操作方式
1、直接編譯生成a.o, b.o,然後鏈結libh.a,沒有問題,正常
2、將b.c打包成庫libb.a,然後編譯生成a.o,然後鏈結libh.a,libb.a,則a.o,libb.a, libh,a能鏈結通過,沒有問題,正常
現在的問題是不鏈結libh.a,問題來了
1、直接編譯生成a.o, b.o,然後鏈結則會報錯,說func1找不到
2、將b.c打包成庫libb.a,然後編譯生成a.o,然後鏈結libb.a,則有兩種情況
1)如果a.c中不呼叫b.c中的函式,則能鏈結通過並生成執行檔案,
2)如果a.c中有呼叫b.c中的函式func2,同鏈結不能通過。
不知道三種情況下,為什麼a.c中調不調libb.a中的函式會有兩種不同的表現?難道不呼叫libb.a中的函式的時候,libb.a就不會去鏈結libh.a嗎?求解
linux
鏈結靜態庫
------解決方案--------------------
靜態庫中沒有內容被引用的 .o 檔案是不會參與鏈結的。
**:*************** elta的分割線 ***************=
這個錯誤最近經常出現,而且讓人一頭霧水。找到的這個答案講解的也很清楚了。
靜態庫,靜態鏈結,動態鏈結 的區別
遺憾地說 除了ender說的 靜態庫在程式執行時就會裝入記憶體,而動態庫在呼叫的時候才裝入!是正確的外,其他觀點都有偏頗之處甚至是錯誤的。我的感覺是,大家受mfc的影響太深了,而沒有看到事情的本質。首先糾正所謂 靜態連線就是把需要的庫函式放進你的exe之中 的說法。在真實世界中,有三個概念 use ...
linux中的靜態鏈結庫
c 編譯四個步驟,預處理,編譯,彙編,鏈結,所謂的靜態鏈結庫就是把部分寫好的 編譯到彙編結束這個步驟,然後把它們打包起來,等到再寫別的程式需要用到這裡的某些函式的時候,只需要把這個程式和之前的庫鏈結起來就可以了,簡化了編譯的步驟。不過靜態鏈結庫鏈結到某個程式這是一錘子買賣,可以認為只是單純的在你生成...
Linux下靜態鏈結庫
放置在一起的物件模組的集合,這些物件模組都儲存於乙個存檔檔案中 乙個程序一般分為乙個部分 環境變數,堆疊,空閒記憶體,動態記憶體,可執行程式映像 包括程式本身的執行 還有就是鏈結的靜態庫 共享庫 一般為動態鏈結庫.so檔案 其他記憶體 靜態鏈結庫是在編譯生成可執行檔案是鏈結並裝載複製靜態鏈結庫中自己...