2

每当我使用 MinGW 编译 C++ 应用程序时,它们都可以在现代版本的 Microsoft Windows 中正常工作,包括 Windows 2000 和 Windows XP。

但是,当我尝试在 Windows 95 和 Windows NT 4.0 上运行它们时,我收到以下错误:

这是否意味着这些版本根本不支持运行已编译的 C++ 应用程序的想法?

注意:我还没有测试过Windows 98 和Windows ME。

编辑:我已经测试了 Windows 98。testsortingvisualization运行正常,但是tetrisimplementation显示一个空白的命令提示符并且不会停止。这两个程序都给出了上面在 Windows 95 和 Windows NT 4.0 中给出的完全相同的错误。请记住,Windows 2000 可以同时正确运行。

编辑:微软声称我使用的一些功能(WriteConsoleOutput、GetAsyncKeyState)对 Windows 2000 有最低要求。事实上,它经过测试不能在 Windows 98 中工作。我还没有找到一种更兼容的方式来进行控制台输出(系统8 位代码页、80 列、25 行、16 色)或按键检测。

MSVCRT.DLL 故障:DLL 是已编译 C++ 应用程序的关键依赖项,因此根本不可能在 Windows 95 上运行任何已编译 C++ 应用程序。

我还没有找到 NT 4.0 问题的解释。

4

4 回答 4

3

编译时,编译器似乎找不到特定 Windows 版本或特定 Internet Explorer 版本的正确定义。这是为什么?在包含 windows.h 头文件之前,您需要将定义 _WIN32_WINDOWS、_WIN32_WINNT、WINVER 和/或 _WIN32_IE 设置为您计划支持的最小平台。这些定义的可能值可以在头文件 w32api.h 中找到。

取自这里

于 2020-01-16T07:55:11.887 回答
2

MS Visual C++ 运行时 DLL 未随 Windows 的早期版本一起分发,您要么将代码静态链接到 Microsoft 库(MinGW 不可能),要么将依赖项与应用程序一起部署。

VC++ 的可再发行部分(其中包括 MSVCRT.DLL)在一个特定于 VC++ 各种版本的可再发行包中提供,MSCVRT.DLL 来自 VC++ 6.0,并且不再从官方来源获得;例如,您可以自担风险从这里获取它。

您的 Windows NT 4.0 错误是由于您的代码使用的 API 在 NT 4 最新版本中不属于 Win32 API。您可以通过各种宏指定目标 Windows 版本,以限制您的代码可用的 API。这将生成编译时错误,而不是运行时错误。如果该特定调用对您的应用程序至关重要,那么它根本无法在 WinNT 上运行。的文档SetCriticalSectionSpinCount()指出,支持的最低系统是 XP。

关于您的控制台 I/O 问题,MSVCRT.DLL 包括 Microsoft 的conio 库(与 Borland 的不同或广泛)。MinGW 包括我认为或这里的 conio.h 标头。这可能会提供您需要的东西。

于 2020-02-15T02:45:01.287 回答
0

我可以在这里写关于实际问题的小说,但底线是这样的:

较新的 C/C++ 运行时库,无论是静态链接还是动态链接到目标 EXE,都依赖于 Windows 9x 中不可用的操作系统 API。您将需要一组仍与这些 a̶n̶c̶i̶e̶n̶t 旧版 Windows 兼容的工具。

如果您想针对 Windows 95 和 NT 4,您将需要 Visual Studio 2005 或更早版本。根据Wikipedia 页面

Visual Studio 2005,代号 Whidbey ... 于 2005 年 10 月在线发布 ... ...它是适用于 Windows 2000 的最后一个版本,也是最后一个能够针对 Windows 98、Windows Me 和 Windows NT 4.0 的版本C++ 应用程序。

您也许可以使用 MinGW 做一些混合的事情 - 让它仍然是编译器,但与 Visual Studio 2005 中较旧的 MSVC*.lib 文件链接。

于 2020-01-16T09:18:48.837 回答
-1

也许您可以静态链接到所需的库?

于 2020-01-16T08:28:15.827 回答