我們剛剛嘗試鏈接使用Visual Studio Express 2008編譯的代碼集與使用Visual Studio 2003編譯的.lib時的有趣體驗。所有內容都在C++中。確切地說,它是在VS2003中編譯爲.lib的SystemC 2.2.0內核,以及在VS2008中編譯的SystemC模型。爲什麼在VS2003中編譯的.lib無法與使用VS2008編譯的代碼鏈接?
鏈接時,我們不斷收到在鏈接過程中沒有找到SystemC.lib文件中幾個符號(即在VS2003中編譯)的錯誤。我們得到正的錯誤是這樣的(在幾個變種):
SystemC.lib(sc_port.obj) : error LNK2001: unresolved external symbol "public: vo
id __thiscall std::_String_base::_Xran(void)const " ([email protected][email protected]@@QB
EXXZ)
從各種線索挖,原來該功能預計將找到的.lib是這樣的:
Undecoration of :- "[email protected][email protected]@@QBEXXZ"
is :- "public: void __thiscall std::_String_base::_Xran(void)const "
雖然這VS2008試圖用(libcpmt.lib)鏈接庫文件使用不同的調用約定:
Undecoration of :- "[email protected][email protected]@@SAXXZ"
is :- "public: static void __cdecl std::_String_base::_Xran(void)"
我試圖找出爲什麼這個不兼容的發生,但最終我放棄了,recompil編輯VS2008中完全相同的Visual Studio項目,並使用該SystemC.lib代替VS2003中的那個。現在,事情完美無缺。
所以這裏的根本問題是:什麼從VS2003變成VS2008會導致一些功能改變他們的調用約定?是否有一些神奇的標誌給VS2008中的鏈接器使用其他函數具有相同的調用約定在VS2003編譯的其他庫?
更新,到目前爲止的答案摘要:Microsoft很可能會將C++(不是C,只是C++)ABI從一個主要版本的Visual Studio更改爲下一個。庫中還可能存在導致不兼容的其他更改。最好的建議是爲每個版本的VS重新編譯.lib。從本質上講,只需將它在源代碼中發佈給用戶,並讓他們使用它們碰巧安裝的任何版本的VS進行本地編譯。
的基本問題是通過使用建議發現:
注意,這些問題沒有回答這個問題:
問題是'爲什麼它不會失敗?' :) – JohnIdol 2009-08-13 14:01:01
那種自然的反應吧? – jakobengblom2 2009-08-13 14:09:46