Re: [問題] Static library 觀念請教

看板C_and_CPP作者時間15年前 (2010/08/25 14:11), 編輯推噓1(105)
留言6則, 4人參與, 最新討論串2/2 (看更多)
感覺推文很跳針,回覆可能好一點 orz ※ 引述《QQ29 (我愛阿蓉)》之銘言: : 我對static LIB的觀念一直都沒建立好 : 而這幾天遇到一些問題 自己做實驗 跟我目前有的觀念結論是完全相反 : 請教各位 請幫助我建立正確的觀念.... : 現在我先寫一個A.lib + A.h 裡面只有一個function叫 void A();編譯好後 : 再寫一個 B.lib時 我有個 void B(){會呼叫A();} : 1.這邊和我觀念相反的是 我以為再編譯B.lib時 一定要附上A.lib 不然他會link不到 因為這裡的 .lib 只有編譯沒有連結 : 但事實上 我不用給A.lib 只用給A.h 他只用看到A()的宣告 就編譯的過去了 : 現在有個Program C.exe: 再寫時 我必須用到 B(); 所以我很自然的把B.lib和B.h拉到專 : 案裡 : 2. 呼叫了B()後 按下compile F5.....他卻說unresolved external symbol 找不到A() 因為 linking 時必須要解決懸置符號,B.lib只有包含B(); 的定義,而A.lib只有 A();的定義,所以你要兩個都加進來 link 才會過。 : 跟我觀念又不一樣了....我以為B在compile成B.lib時 會把A.lib的內容給包起來.....所 如果你把 A的source放到B 的專案一起編成一個 lib 就會包起來 : 以只用給B.lib就夠了 : 事實上卻必須把A.lib和B.lib都給c.exe去compile 而且不解的是A.h不用給c.exe 他就 : 認得到A() : ======================================================================== : 以上關於兩點 : 到底為什麼會這樣呢??? : 想了解一下實際上的原理.... : 我一直把.lib想成是和cpp的角色一樣 .lib把它當成 object file 集合吧,gcc 的static library是稱為 .a (archive) : 所以會把2. 這邊認為是 B.lib會包好A.lib的內容 除非你生 lib 的時候,把A的 object files也包進來 : 就算是真的把A.lib拉進去專案 但是我並沒有include a.h 應該呼叫B()時候 他會說沒 : 有define A()吧? VC 我不太清楚,不過 gcc 會給警告。gcc會給沒宣告過的function一個預設的 prototype。 : 但顯然我觀念錯了 根本就類似dll的感覺 要用的話要拿進來 只不過compile time用到 : 而已 : 我環境是VC9 : 請教各位 謝謝 呃 ... 以上有錯的話請各位板友幫忙修正 OTZ -- ◣◣◣▂▃▂ ψ域 ◣◣▉▉█ ▂▂▂▂▂▂▂ ▂ ▂ 半分幻の庭師 ◣東方project系列  ̄ ̄ ̄ ̄ ̄ ̄ ̄ /▂▂▂▂▂ 魂 魄 妖 夢 持續推廣ing ∮▼▆▆▆▆▇  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ◣◣ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.121.197.32

08/25 15:08, , 1F
我猜他是在B.h裡有include A.h 所以A()的宣告可見?
08/25 15:08, 1F

08/25 15:22, , 2F
說的也是,也許應該請原po貼程式碼上來 XD
08/25 15:22, 2F

08/25 18:12, , 3F
我有故意把 B.h裡面include A.h拿掉 也是OK
08/25 18:12, 3F

08/25 23:33, , 4F
我想請問一下 如果我現在B改成B.dll用到a.lib的話
08/25 23:33, 4F

08/25 23:34, , 5F
c.exe要用B.dll還是要附上a.lib嗎??
08/25 23:34, 5F

08/27 11:14, , 6F
dll 有link過了...
08/27 11:14, 6F
文章代碼(AID): #1CTBGF-c (C_and_CPP)
文章代碼(AID): #1CTBGF-c (C_and_CPP)