2013-09-27 54 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++在这方面并不一致,并且更改构建模式可能会激活编译器中的不同代码路径 - 有些路径会修剪目录名称,而其他路径则不会。