2013-09-27 70 views
0

我可以在Visual C++ 6.0的非Unicode調試模式下使用Windows 7 64位上的所有Service Pack編譯我的32位ATL項目(COM庫)。它在兩種情況下都能正常工作:如果正常運行或以管理員身份運行。發佈版本中的Visual C++ 6編譯錯誤

但是非Unicode版本構建失敗。

對於初學者來說,VC++編譯器無法找到包含文件(如schannel.h,因爲它屬於Platform SDK,因此它在另一個文件夾中)。只有編譯器在Release版本中掃描了VC++本身的核心Include文件夾(儘管Platform SDK的文件夾在Options中指定,無論如何在調試模式下都沒有問題)。我試圖將SDK中的包含文件複製到Program Files(x86)以外的某個位置,因爲認爲VC++ 6.0可能不夠好,並且UAC問題(並且無法以某種方式訪問​​包含在原始受限位置),但它沒有幫幫我。最後,我將編譯器無法找到的所有文件複製到VC++本身的Include文件夾中,這讓我進一步深入。編譯器以一種新的方式抱怨(僅舉幾個例子): C:\ Program Files(x86)\ Microsoft Visual Studio \ VC98 \ INCLUDE \ wintrust.h(139):error C2143:syntax error:失蹤 ';' '*' C:\ Program Files(x86)\ Microsoft Visual Studio \ VC98 \ INCLUDE \ wintrust.h(139):錯誤C2501:'CMSG_SIGNER_INFO':缺少存儲類或類型說明符 C:\ Program Files x86)\ Microsoft Visual Studio \ VC98 \ INCLUDE \ wintrust.h(139):錯誤C2501:'psSignerInfo':缺少存儲類或類型說明符

但錯誤日誌不再包含任何「文件未找到」或類似的東西。儘管這些錯誤看起來很像「找不到文件」的症狀,但這只是一種猜測。無論如何,我將Platform SDK的完整包含文件夾複製到VC++ Include文件夾中,但它沒有幫助。

再一次,調試版本就好了。然後,我開始比較我使用的Debug和Release MinDependency非unicode構建的編譯和鏈接選項,並最終使它們完全相同。

我發現驅動VC++瘋狂的唯一事情是它放在生成文件中的調試信息量。

總之。如果我使用/ Zl開關編輯(程序數據庫進行編輯並繼續),它可以工作。其他一切都失敗了(包括程序數據庫)。

此前,當我有Win XP的時候,我沒有這樣的問題。在Win7 64位上,是否仍然可以使用舊的VC++ 6.0?我迫切需要那些舊的VC++作爲新的兼容性問題(我也有VS 2008,一切都很好,但即使它在MinDependency中鏈接,生成的.DLL也不適用於某些非常舊的系統)。

我的猜測是,當使用/ Zl開關時,VC++甚至可能會使用不同的編譯器。但這只是一個瘋狂的猜測,無論如何我不知道如何檢查這個以及接下來要做什麼。任何線索?

+2

如果您無論出於何種原因都必須使用15年前的編譯器,那麼您也應該維護一個WinXP,或者甚至是Win2K或更早版本的機器以進行開發。至少,使用Windows的32位版本。 – Praetorian

+0

那麼,我已經在研究這些選項。至少我可以用我的PC開發和調試(因爲它可以和調試版本一起工作),並可以在其他地方編譯發佈版本(這不會每天都會發生)。不完美,但仍然比沒有好。 – Alex

+0

啊!試圖在WinXP 32位,並得到同樣的問題。看起來像VS 6.0 SP6和平臺SDK 2003年2月(2002年8月也有問題)有問題。早些時候,我使用了他們的另一個版本,比較舊的VS 6.0和舊的SDK,雖然谷歌說VS 6.0 SP6和平臺SDK 2003年2月應該一起工作就好了... – Alex

回答

0

唉,終於搞定了!不知怎的,額外的空間被添加到Options/Directories中的每個路徑中,並且阻止VC++找到一些包含或lib文件(這發生在不同系統上,XP和Seven,可能在複製/粘貼目錄路徑期間添加空間是典型的事情)。有趣的是,VC++在這方面並不一致,並且更改構建模式可能會激活編譯器中的不同代碼路徑 - 有些路徑會修剪目錄名稱,而其他路徑則不會。