2010-08-30 25 views
1

我正在將傳統C++系統從VC6移植到VC9。從VC6遷移到VC9的編譯問題

應用程序(<APP A>)靜態鏈接到內部應用<APP B>(在家裏,而是由一個單獨的團隊開發)。 從<APP B>的頭文件的本地副本都包含在CPP文件和<APP A>.

編譯目前我們不打算遷移到<APP B> VC9。雖然兩個<APP A><APP B>將採用獨立的CRT顯示器,但沒有衝突的預期。

我們所面臨的問題是,包括(在本地副本)文件沒有得到編譯VC9。

致命錯誤C1083:無法打開包含文件 :「iostream.h」:沒有這樣的文件或目錄

可能的解決方案: 如果我做的<APP A>在本地副本的修改和編譯與VC9,那麼我不知道它是否會在運行時造成一些問題。

有沒有其他方法可以讓我用VC9編譯<APP A>文件,而不是<iostream.h>而不是<iostream>

+1

「將使用獨立的CRT,但不會產生衝突」。如果''(大概是一個庫)引用了它的頭文件中的流對象,並且你在A和B之間調用時使用了這些流對象的不同定義, (看起來)很可能會遇到嚴重的問題。 – 2010-08-30 08:33:02

+0

如果存在應用程序之間的任何數據交換,那麼您是對的。但是在這裏沒有這樣的交換,因此,我認爲沒有衝突。 – 2010-08-30 08:50:54

回答

1

關於這種類型的項目,Michael Feathers http://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052有一本很棒的書。

簡短的回答是,如果您有測試,請進行必要的更改和重構,然後重新運行測試。對於你的例子,我會使用一個預處理器指令來選擇基於編譯器版本的正確包含,然後修復所有破壞的測試。

沒有你更有點麻煩了測試,你要麼把它們寫或祈禱你不要破壞任何東西

1

我懷疑這個編譯器錯誤將是唯一​​的問題。更新編譯器幾乎總是會引入少量問題。它最好解決這些衝突並認真測試結果。無論如何,一些「解決方法」會減少麻煩,因爲編譯器不同。

#if _MSC_VER >= 1200 
    // Code for VC 6.0 or higher goes here 
#endif 

注意,數目_MSC_VER從Visual Studio中的版本的不同:​​

唯一的解決方案在並行使用不同的編譯器當條件編譯如解決這樣的問題。 對於Visual Studio 2010,即_MSC_VER定義爲1600.

4

對不起,但您遇到了一系列問題。

首先基本知識:<iostream.h>是一個較舊的Microsoft標頭,用於定義例如::cout<iostream>是標準標題,並定義了例如std::cout。您可以同時使用這兩種,但此標頭 應該而不是包含在APP.H中。 <iostream>未定義您在聲明中使用的類型。據推測,你是依靠VC6實施的人爲因素,即<iostream.h>拉到<istream.h><ostream.h>。您可能需要切換到<iosfwd>,而其中打算用於標頭。然而

更大的問題是你的假設,你可以只鏈接「APP A」和APP B」在一起,即使它們用VC6和VC9編譯。這是真的當且僅當他們共享一個extern "C" API 。因爲你提到了<iostream.h>而不是<stdio.h>,所以我假設你的共同點實際上是C++。