C++ 编译在DOS模式下运行的程序

C++ 编译在DOS模式下运行的程序,c++,dos,C++,Dos,我写了一个简单的程序,在DOS模式下运行。一切都在Win XP/Vista/Seven中的模拟控制台下工作,但在DOS中不工作。错误显示:此程序不能在DOS模式下运行。我想知道这是编译器标志的问题还是更大的问题 对于编程,我使用Code::Blocks v 8.02和以下编译设置: -墙-W-学究式-学究式错误 在项目\生成选项\编译器设置中 我尝试了一种干净的DOS模式,从cd引导,并在虚拟机中设置DOS。同样的错误也出现了 我应该打开更多的编译器标志吗?一些具体的386/486优化 更新 好

我写了一个简单的程序,在DOS模式下运行。一切都在Win XP/Vista/Seven中的模拟控制台下工作,但在DOS中不工作。错误显示:
此程序不能在DOS模式下运行
。我想知道这是编译器标志的问题还是更大的问题

对于编程,我使用Code::Blocks v 8.02和以下编译设置:

-墙-W-学究式-学究式错误

在项目\生成选项\编译器设置中

我尝试了一种干净的DOS模式,从cd引导,并在虚拟机中设置DOS。同样的错误也出现了

我应该打开更多的编译器标志吗?一些具体的386/486优化

更新

好的,我已经下载、安装并配置了DJGPP。甚至解决了libs和include的一些问题。还有两个问题

1)我无法编译一个调用
\u strdate
\u strtime
的代码,我已经仔细检查了包含项,因为MSDN说它需要
时间.h
,但错误仍然是:
\u strdate未在此范围内声明
,我甚至尝试添加std:\u strdate,但我有4个,而不是2个相同的错误

2)第二个代码是关于
gotoxy
,看起来是这样的:

#include <windows.h>

void gotoxy(int x, int y)
{
  COORD position;
  position.X = x; position.Y = y;
  SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), position);
}
它现在在DJGPP下编译

更新3

仍然需要使用
gotoxy
来解决代码问题-将其替换为其他编译代码(在DJGPP下)


谢谢大家的帮助。刚刚学习了一些有关编译的新知识(标志、旧IDE,如DJGPP、OpenWatcom)和刷新内存设置DOS以使其工作:-)

您想告诉编译器以DOS为目标。我不知道怎么做,抱歉,但也许这会成为谷歌搜索的一个提示

看看Code::Blocks网站,您的IDE似乎可以支持各种编译器(GCC、MSVC++和其他)。因此,首先,找出您正在使用的编译器。然后检查编译器文档

一旦你们知道你们在使用什么编译器,你们就可以重新表述(精炼)你们的问题——我相信stackoverflow上的人会知道的

据介绍,openwatcom]编译器的目标似乎是dos。此外,IDE(代码::块)也支持它


祝你好运

听上去,您目前正在编译一个Windows控制台程序。即使它是一个控制台程序,它仍然需要Windows来运行

要编译一个在真正的DOS上运行的程序,您需要找到一个(可能非常旧的)编译器和(特别是)链接器,它以DOS为目标,可以生成DOS MZ可执行文件。最后一个针对MS-DOS的Microsoft编译器是VC++1.52c。如果内存服务,Borland继续目标DOS稍后,通过一些类似BROLAN C++ 5左右。 我相信如果你检查数字MARS网站,他可能还有一个C++编译器,目标是DOS。否则,你会被困在寻找一些旧的和相当旧的东西

编辑:看到其他答案让我想起了DJGPP和OpenWatcom。我很抱歉之前没有提到他们

注意,从C++的观点来看,Borland和微软都是旧的编译器——它们根本不做命名空间,模板支持不同于微软编译器中的不存在到Borland的平庸。DJGPP基本上是一个DOS扩展器,gcc已经被移植到该扩展器中;它过时(或现代)的程度将取决于所涉及的gcc版本。如果我没有弄错的话,数字MARS编译器比Borland一个更现代,但是Walter Bright现在大部分时间都在D上工作而不是C++,所以C++编译器并不真正与GCC或MSVC竞争,更不用说像EGG前端那样的CuMo或英特尔。


基本上,使用DJCPP作为Code::Blocks的后端。

您所指的“仿真控制台”与仿真或DOS无关。您可能仍在生成32/64位Windows可执行文件,只是使用控制台子系统

首先,将编译器更改为能够生成16位代码的编译器。我很确定它仍然支持16位MZ目标机。IIRC也是,但我不确定,也不知道它是否还保持着

编辑:关于gotoxy,您可以:

  • 使用,而不在乎内部使用的是什么(尽管我认为它是INT10)
  • 自己使用
  • 0xB8000处直接写入VGA内存

  • 我从来没有真正为DOS开发过,所以我不知道哪种方法是最好的。第三个似乎是最快的。win32 exe中有一个dos存根头,在纯dos上运行时显示此消息。您应该使用dos编译器(如TurboC)进行编译,如果在case代码块中有dos,则应提供目标平台。这是一个软件问题,而不是硬件平台。

    我曾经使用DJGPP在普通ms dos下编译东西


    这是一个完整的免费编译器套件,应该仍然可以无缝工作

    您可以使用DJGPP附带的
    conio.h
    标题中的
    gotoxy

    使用conio.h库中的gotoxy。(dos-friendly;)

    #包括
    #包括
    void main()
    {
    gotoxy(5,5);
    printf(“在(5,5)处打印”);
    }
    
    简单的

    在Linux或Windows上托管的GCC 6.2可以链接.COM文件。(它在Mac上使用Winery和MinGW托管bash shell,并提取windows归档文件)


    使用DosBox(或Mac上的Boxer)、QEMU、VirtualBox进行测试,而不是重新启动您关心的真实物理机器。

    请记住,如果您将其构建为DOS可执行文件,它将不会在64位Windows上运行,因为它将是一个16位可执行文件,64位Windows不包括用于运行DOS可执行文件的16位NTVDM系统。没关系,我只需要在严格的DOS环境中运行它
    time_t rawtime;
    struct tm * timeinfo;
    char buffer [20];
    
    time ( &rawtime );
    timeinfo = localtime ( &rawtime );
    
    strftime (buffer,80,"%Y.%m.%d %H:%M:%S\0",timeinfo);
    string myTime(buffer);
    
    #include <conio.h>
    #include <stdio.h>
    
    void main()
    {
        gotoxy(5,5);
        printf("Printing at (5,5)");
    }