Re: [問題] dll :implicit link 和 explicit link
※ 引述《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
02/10 10:06, 2F
→
02/10 10:07, , 3F
02/10 10:07, 3F
推
02/10 10:35, , 4F
02/10 10:35, 4F
推
02/10 10:44, , 5F
02/10 10:44, 5F
推
02/10 10:51, , 6F
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
02/21 01:28, 9F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):