我写了一个简单的程序,在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
仍需要使用解决代码 - 将其替换为其他编译的代码(在DJGPP下)。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);
感谢您所有寻求帮助。刚学到一些关于编译的新东西(标志,旧的IDE,如DJGPP,OpenWatcom)和刷新的内存设置DOS工作: - )
答案 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
,您可以:
0xB8000
我从来没有真正开发过DOS,所以我不知道哪种方法会被认为是最好的。然而,第三个似乎是最快的一个。
答案 2 :(得分:2)
基本上,使用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)");
}
简单
答案 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)
ia16-elf具有GCC 6.2以链接.COM文件。 (它使用Winery和MinGW在Mac上托管bash shell并解压缩windows存档)。
使用DosBox(或Mac上的Boxer),QEMU,VirtualBox进行测试,而不是重新启动您关心的真实物理机。