看板 C_and_CPP 關於我們 聯絡資訊
我對static LIB的觀念一直都沒建立好 而這幾天遇到一些問題 自己做實驗 跟我目前有的觀念結論是完全相反 請教各位 請幫助我建立正確的觀念.... 現在我先寫一個A.lib + A.h 裡面只有一個function叫 void A();編譯好後 再寫一個 B.lib時 我有個 void B(){會呼叫A();} 1.這邊和我觀念相反的是 我以為再編譯B.lib時 一定要附上A.lib 不然他會link不到 但事實上 我不用給A.lib 只用給A.h 他只用看到A()的宣告 就編譯的過去了 現在有個Program C.exe: 再寫時 我必須用到 B(); 所以我很自然的把B.lib和B.h拉到專 案裡 2. 呼叫了B()後 按下compile F5.....他卻說unresolved external symbol 找不到A() 跟我觀念又不一樣了....我以為B在compile成B.lib時 會把A.lib的內容給包起來.....所 以只用給B.lib就夠了 事實上卻必須把A.lib和B.lib都給c.exe去compile 而且不解的是A.h不用給c.exe 他就 認得到A() ======================================================================== 以上關於兩點 到底為什麼會這樣呢??? 想了解一下實際上的原理.... 我一直把.lib想成是和cpp的角色一樣 所以會把2. 這邊認為是 B.lib會包好A.lib的內容 就算是真的把A.lib拉進去專案 但是我並沒有include a.h 應該呼叫B()時候 他會說沒 有define A()吧? 但顯然我觀念錯了 根本就類似dll的感覺 要用的話要拿進來 只不過compile time用到 而已 我環境是VC9 請教各位 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 219.87.64.222
Bencrie:懸置的 symbol 只需要在 linking時被解決 08/25 13:40
Bencrie:static library你就當成是一堆 obj檔的合體吧 XD 08/25 13:40
Bencrie:跟你在編譯obj的時候函數只要有宣告compile就會過的情況是 08/25 13:42
Bencrie:一樣的。 08/25 13:42
Bencrie:A.lib和B.lib要跟 c.exe做 link,解決懸置 symbol 08/25 13:44
hilorrk:如果每link一個lib就要把該lib內容包進來...我的記憶體大 08/25 15:00
hilorrk:概又要抱怨了XD 08/25 15:00
hilorrk:我反而覺得這問題跟lib沒啥關 是沒搞清楚compile和link吧 08/25 15:06
Bencrie:static linking 的確是很耗空間沒錯啊 XD 08/25 15:20
tinlans:聰明的 linker 也是會挑著抓的。 08/25 20:13
aecho:我記得.lib的角色是解釋.dll裡面的function name和 08/25 21:37
aecho:function address !?? 08/25 21:37
aecho:因為.dll裡的function name可能會加工處理,會和.h有出入 08/25 21:38
QQ29:我現在講的lib是static lib沒有dll@@ 08/25 23:33