我將VS2008中的舊代碼移植到VS2013。該代碼庫的一部分是一個相當複雜的文件記錄庫,它覆蓋了streambuf並將其與fstream關聯。它通過streambuf和fstream的繼承來實現這一點。覆蓋fstream的streambuf
但是,當我嘗試將生成的DLL與使用它,我得到另一個DLL鏈接:
1>syscored.lib(syscored.dll) : error LNK2005: "public: void __thiscall
std::basic_fstream<char,struct std::char_traits<char> >::close(void)"
([email protected][email protected][email protected]@[email protected]@@[email protected]@QAEXXZ) already
defined in iptsrvfl.obj
1>syscored.lib(syscored.dll) : error LNK2005:
"public: void __thiscall std::basic_fstream<char,struct
std::char_traits<char> >::`vbase destructor'(void)"
([email protected][email protected]@[email protected]@@[email protected]@QAEXXZ) already
defined in iptsrvfl.obj
基本上,從fstream的繼承導致該DLL導出一些fstream的的符號。我使用該DLL的類也使用標準fstream實例,close()和dtor()的符號被視爲已經定義。
我試着改變fstream派生類來使用遏制而不是繼承,但是沒有辦法將自定義streambuf與包含的流關聯起來。它根本不通過公共界面暴露。 (我們在fstream的ctor中調用init(streambuf))。
有人可以告訴我: 1)如何將streambuf與包含的fstream相關聯,或者2)如何避免此符號衝突。
謝謝。
「streambuf和fstream的繼承」。相同的類是否同時繼承streambuf和fstream或兩個不同的類? – 2014-09-24 14:16:05
兩個不同的類。 streambuf派生類並不是我的問題。問題是我如何將它與fstream聯繫起來。 – dviljoen 2014-09-24 14:29:58
看起來傳統代碼正在通過本書做正確的事情。沒有看到任何問題。顯示你如何鏈接你的DLL(完整的鏈接器命令)。 – 2014-09-24 14:40:19