好的,我可能应该先提供更多背景信息。我正在开发在 Visual Studio 6 中开发的旧版 C++ 解决方案,因为我不喜欢 Visual Studio 6 UI,所以我已切换到带有 Daffodil 扩展的 Visual Studio 2010,以便在仍在工作和调试的同时使用 VC6 编译器构建旧版解决方案在 Visual Studio 2010 中(另外一个好处是,SourceSafe 集成在 Visual Studio 2010 中也好很多)。
该解决方案构建良好,但无法运行,根据旧项目所有者的说法,这是由为其中一个项目编译文件的顺序引起的。到目前为止,他一直是对的,我没有理由不相信他。现在我想我在某处读到 C++ 中文件的编译顺序没有规则,并且 Visual Studio IDE 根据文件名编译项目中的文件(但显然不是 Visual Studio 6 IDE),所以我为所有文件添加了后缀sourcefilenames 具有与 Visual Studio 6 项目中文件的编译顺序匹配的升序编译编号,并且看哪.. 编译顺序仍然与 Visual Studio 6 项目的编译顺序不匹配。那么是否有任何其他方式可以影响这一点,或者我是否以错误的方式解决这个问题?或者 IDE 是否实际上检查了 headerfilenames 而不是 sourcefilenames 来确定编译顺序?(我不愿意更改头文件名,因为这会导致大量代码更改)。
PS:我不是想弄清楚为什么编译顺序对程序运行很重要或如何解决这个问题,我只是想看看我是否可以影响 Visual Studio 2010 中的编译顺序来证明或反驳它很重要到这个项目编译的最终结果。
更新:也许这不是文件初始化惨败,并且项目所有者错了。我只是按照正确的顺序手动编译了所有文件(如 pwny 建议的那样)并运行程序,它会弹出一个异常消息框,提示“应用程序无法正确初始化(0xC0000005)”。看起来程序运行到了一个索引器用于指向集合对象的空指针的点。相关文件具有 .tem 文件扩展名而不是 .cpp(以及包含的 .hpp 头文件#includes .tem 文件),它可以追溯到 1994 年在无法自行构建的 makefile 项目中。当我从“调用堆栈”窗口导航到文件时,调试器拒绝向我显示任何信息。这是漫长的一天,所以我明天继续,也许将 makefile 项目变成一个 DLL,将文件重命名为 .cpp,摆脱循环包含,并希望最好。