Re: [問題] dll :implicit link 和 explicit link

看板C_and_CPP作者 (あら~)時間14年前 (2010/02/10 02:30), 編輯推噓7(702)
留言9則, 7人參與, 最新討論串2/2 (看更多)
※ 引述《QQ29 (我愛阿蓉)》之銘言: : 變成目前結論是你export給別人如果class都是virtual就不用給lib : 如果有非virtual就要lib... 某方面來說這是對的... 對一般function,和member function來說 要嘛就拿著.lib去一起link,要嘛就GetProcAddress 這兩件事一定要選其中一件來做 必須要告訴linker: 1) 我這邊使用了foo(),而且我也有它的定義 2) 我這邊使用了foo(),而且我知道它在某個dll裡面有,請你去查然後幫我設好 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 這就是.lib告訴linker的事 不然就會報error 但是virtual function不一樣 call virtual function的時候是用某種查表的方式達成的 他大概是這樣做: 1. 把virtual function的address集中到一個表格 2. 在物件construct時,把表格的指標塞進instance裡 3. call virtual function的時候大概這樣: 假設ptr是你物件實體(instance)的指標 table *mytbl = ptr->__vtbl;// 這是隱藏的member,編譯器偷加的 void (*fptr)(CTestDLL * const this) = mytbl[0].addr;// 這個array index編譯器也會負責搞定 fptr(ptr); 所以call virtual function其實不會吃到virtual function本體的定義 當然如果執行時仍然沒有該有的定義,程式就會掛點... 就像把.dll移到其他地方去那樣 回到一開始的問題,現在沒有覺得比較理所當然了? 把一個virtual function變成一般function... 然後沒有提供定義的話,當然不能link call virtual function並不需要定義,所以不管有沒有丟.lib都沒影響 但是construct一個instance時,是需要virtual function定義的 不然那張表格裡要填什麼呢? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.37.177.28

02/10 09:59, , 1F
先推一下, 用力理解中....@_@"
02/10 09:59, 1F

02/10 10:06, , 2F
virtual function?似乎與C++容易搞混 直接稱函式指標會不會
02/10 10:06, 2F

02/10 10:07, , 3F
清楚點?
02/10 10:07, 3F

02/10 10:35, , 4F
virtual function 本質就是 function pointer 啊...
02/10 10:35, 4F

02/10 10:44, , 5F
二樓 這裡說的就是 C++ 的 virtual function 啊...
02/10 10:44, 5F

02/10 10:51, , 6F
小弟我和樓上L大有同樣的疑問XD 也推l大的本質:)
02/10 10:51, 6F

02/10 11:21, , 7F
了解!感謝!
02/10 11:21, 7F
改個錯字 ※ 編輯: coldstars 來自: 114.37.171.147 (02/10 12:08)

02/10 12:34, , 8F
謝謝我有空趕緊理解
02/10 12:34, 8F

02/21 01:28, , 9F
高手~筆記ing
02/21 01:28, 9F
文章代碼(AID): #1BSQcfeD (C_and_CPP)
文章代碼(AID): #1BSQcfeD (C_and_CPP)