编译程序以在DOS模式下运行

时间:2010-01-14 19:18:25

标签: c++ dos

我写了一个简单的程序,在DOS模式下运行。一切都在Win XP / Vista / Seven中的模拟控制台下运行,但不在DOS中。错误说:this program caonnot be run in DOS mode。我想知道编译器标志的问题或更大的问题。

对于编程,我使用Code :: Blocks v 8.02进行编译设置:

-Wall -W -pedantic -pedantic-errors

Project \ Build options \ Compiler settings

中的

我尝试过干净的DOS模式,从cd启动,并在虚拟机中设置DOS。出现相同的错误。

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

更新

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

1)我无法编译调用_strdate_strtime的代码,我已经仔细检查了包含,因为MSDN说它需要{{1 },但仍然错误说:time.h,我甚至试图添加std :: _ strdate,但后来我有4个,而不是2个错误同样的

2)第二个代码约为_strdate was not declared in this scope,它看起来像是:

gotoxy

错误说没有windows.h,所以我把它放到位,但是还有很多错误说windows.h中缺少一些错误,我支持它不会因为这个功能严格适用于Windows吗?有没有办法为DOS编写类似的#include <windows.h> void gotoxy(int x, int y) { COORD position; position.X = x; position.Y = y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), position); }

UPDATE2

1)使用gotoxy代替time();_strdate();解决了这里的代码

_strtime();

现在在DJGPP下编译。

UPDATE3

仍需要使用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); 解决代码 - 将其替换为其他编译的代码(在DJGPP下)。

感谢您所有寻求帮助。刚学到一些关于编译的新东西(标志,旧的IDE,如DJGPP,OpenWatcom)和刷新的内存设置DOS工作: - )

9 个答案:

答案 0 :(得分:7)

从事情的声音来看,您目前正在编译Windows控制台程序。即使它是一个控制台程序,它仍然需要运行Windows。

要编译一个程序以在真正的DOS上运行,你需要找到一个(可能真的很旧)编译器和(特别是)目标DOS的链接器,并且可以生成DOS MZ可执行文件。最后一个针对MS-DOS的Microsoft编译器是VC ++ 1.52c。如果内存服务,Borland继续在稍后的目标上使用DOS,比如Broland C ++ 5左右。

我相信如果您查看Digital Mars网站,他可能仍然有一个针对DOS的C ++编译器。否则,你将不得不寻找使用过的东西而且很老。

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

请注意,从C ++的角度来看,Borland和Microsoft实际上是旧的编译器 - 它们根本不做命名空间,模板支持从微软编译器中不存在到Borland中的平庸。 DJGPP基本上是一个DOS扩展器,gcc已被移植到其中;它过时(或现代)的程度将取决于涉及哪个版本的gcc。如果我没有弄错的话,Digital Mars编译器比Borland编译器更现代,但是Walter Bright现在大部分时间都花在D而不是C ++上,因此C ++编译器并不真正与gcc或MSVC竞争,更不用说基于EDG前端的Comeau或Intel。

答案 1 :(得分:3)

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

首先将编译器更改为能够生成16位代码的编译器。我很确定OpenWatcom仍支持开箱即用的16位MZ目标。 IIRC DJGPP也是如此,但我不确定,也不知道它是否仍然存在。

编辑:关于gotoxy,您可以:

  1. 使用PDCurses并不关心内部使用的内容(我认为它是INT10)
  2. 自行使用interrupt 0x10
  3. 直接写入0xB8000
  4. 的VGA内存

    我从来没有真正开发过DOS,所以我不知道哪种方法会被认为是最好的。然而,第三个似乎是最快的一个。

答案 2 :(得分:2)

瞥一眼:MinGW compile for MS DOS

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

答案 3 :(得分:1)

我习惯使用 DJGPP 在普通的ms-dos下编译。home page

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

使用conio.h 库中的 gotoxy。 (dos友好;))

#include <conio.h>
#include <stdio.h>

void main()
{
    gotoxy(5,5);
    printf("Printing at (5,5)");
}

简单

Also check Borland's documentation

答案 6 :(得分:0)

您想告诉编译器目标dos。我不知道该怎么做,对不起,但也许这可以作为谷歌搜索的暗示......

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

一旦你知道你正在使用什么编译器,那么你可以改写(改进)你的问题 - 我相信stackoverflow上有人会知道。

根据this thread,似乎Open Watcom] 2编译器的目标是dos。此外,它受IDE(Code :: Blocks)支持。

祝你好运!

答案 7 :(得分:0)

在win32 exe中有一个dos存根头,在纯dos上运行时显示此消息。您应该使用dos编译器(例如turbo c)编译它,或者如果DOS是代码块中的DOS,则提供目标平台。它的软件问题不是硬件平台。

答案 8 :(得分:0)

在Linux或Windows上托管的

ia16-elf具有GCC 6.2以链接.COM文件。 (它使用Winery和MinGW在Mac上托管bash shell并解压缩windows存档)。

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