我已經繼承了一個非常大且複雜的項目(實際上是一個'解決方案',由119個'項目'組成,其中大部分都是DLL),它是在VC8(VS2005)下構建和測試的,我有任務將其移植到VC9(VS2008)。什麼是從VC8(VS2005)要VC9(VS2008)的移植問題是什麼?
我用的移植過程是:
- 複製VC8 .sln文件並重新命名它 到VC9 .sln文件。
- 複製全部 VC8項目文件,並將它們重命名爲 它們爲VC9項目文件。
- 編輯 所有的VC9項目文件, s/vc8/vc9。
- 編輯VC9的.sln, S/VC8/VC9/
- 裝入VC9的.sln與 VS2008,並讓IDE '轉換' 所有項目文件。
- 修復 編譯器和鏈接器錯誤,直到我 得到了良好的構建。
到目前爲止,我在最後一步遇到了以下問題。
1)修飾裝飾名稱的方式發生變化,導致名稱被截斷。
這不僅僅是一個警告(http://msdn.microsoft.com/en-us/library/074af4b6.aspx)。使用此警告構建的庫不會與其他模塊鏈接。應用MSDN中給出的解決方案並不重要,但可行。我在How do I increase the allowed decorated name length in VC9 (MSVC 2008)?
中分別解決了這個問題2)一個不允許將零賦值給迭代器的更改。這是根據規範,並且很容易找到並修復這些之前允許的編碼錯誤。而不是將零賦值給迭代器,請使用值end()。
3)for-loop範圍現在按照ANSI標準。另一個易於修復的問題。
4),用於預編譯頭需要更多的空間。在某些情況下,需要更多的空間。我最終使用/ Zm999來提供最大的PCH空間。如果PCH內存使用獲取再撞,我認爲我將不得不完全放棄PCH,只是忍受什麼已經是一個很長的編譯時間的增加。
5)副本和默認dtors的需求變化。目前看來,在模板類,在我還沒有完全想通了,但某些情況下,編譯器不再生成默認構造函數或默認的析構函數。我懷疑這是VC9中的一個錯誤,但可能有其他的我做錯了。如果是這樣,我肯定想知道它是什麼。
6)sln和vcproj文件中的GUID沒有改變。這似乎沒有以我能檢測到的任何方式影響構建,但仍然令人擔憂。
請注意,儘管存在所有這些問題,該項目在VC8下構建,運行並通過了廣泛的QA測試。我也背移植的所有更改VC8項目,他們仍然生成並運行一樣愉快地爲他們(使用VS2005/VC8)以前那樣。因此,對於VC9構建所需的所有更改似乎都是向後兼容的,儘管迴歸測試仍在進行中。
現在真正的難題:我遇到了VC8和VC9項目之間啓動順序的差異。該程序使用在Loki之後建模的小對象分配器,在Andrei Alexandrescu的Book Modern C++ Design中。該分配器使用主程序模塊中定義的全局變量進行初始化。
在VC8下,這個全局變量是在程序啓動的最開始時從模塊crtexe.c中的代碼構建的。在VC9下,執行的第一個模塊是crtdll.c,表示啓動順序已更改。在全局對象可以初始化統計信息之前,啓動的DLL似乎通過分配和釋放內存來混淆小對象分配器,這會導致一些虛假的診斷。程序的運行似乎沒有受到實質性影響,但QA人員不允許虛假診斷通過它們。
是否有某種方法可以在加載DLL之前強制構造全局對象?
我可能會遇到什麼其他移植問題?
原來,使用單身人士是最好的答案。謝謝! – 2014-08-07 16:22:56