在Windows上编译的控制台应用程序是否可以使用DOSBox在Linux和MAC OS X上运行?

Will console applications compiled on Windows work on Linux and MAC OS X using DOSBox?

本文关键字:Linux MAC 运行 DOSBox OS 可以使 编译 Windows 控制台 是否 应用程序      更新时间:2023-10-16

疑点

我在Microsoft Visual c++ 2010 Express中编写了一些代码,如下:

#include<iostream>
int main()
{
    system("cls");
    char name[20];
    cout<<"nEnter your name:";
    cin.getline(name,20);
    system("pause");
    cout<<"nYour name is:"<<name;
    system("pause");
    return 0;
}

现在我已经编译了它并把它发给了一个Linux机器上的朋友。他下载了DOSBox软件并运行了这个程序。

怀疑

它会像在我的机器上一样运行吗?还是会产生任何问题?

为什么我问这个?

我最近下载了一个linux live cd并在我的机器上运行。我无法在这台机器上安装它,因为它是一台共享PC。不管怎样,我在终端输入 cls ,没有响应。我再次输入 pause ,没有响应。所以它让我想知道,如果命令"cls",我在上面的代码传递给系统将真正对linux机器有任何影响。

这个程序不能在其他机器上运行的原因有几个——我将总结两个主要的原因:

  1. 使用其他操作系统不支持的系统指令。如果你试图在不同的操作系统上运行这些指令,操作系统会抱怨它不理解这些指令,程序会崩溃。

  2. (可能更重要的是,)您创建的Windows可执行文件是Windows .exe文件,这是微软的可移植可执行文件格式。Linux只能读取ELF格式的可执行文件,Mac OS X使用Mach-O格式。

这两点本身就值得讨论,正如Joachim在评论中指出的那样,WINE模拟器非常擅长在Linux上模拟windows环境,所以这可能是程序兼容性的一个选项。

编辑:我应该在这里补充一点,第一点假设第2点已经被克服了。第2点是一个操作系统上的可执行文件在其他操作系统上"不能工作"的原因。


对评论的回应:

一般来说,是的,ELF文件是所有Linux发行版的标准(可能有一些罕见的例外)。同样,PE文件是所有Windows版本的标准。如果你有一个相对最新的CPU,那么如果你在一个Linux发行版上编译一个可执行文件,那么它应该可以在其他Linux发行版上运行。

这里的例外是,如果你在一台CPU最近的机器上编译程序,并希望在一台CPU很旧的机器上运行它,旧的CPU可能不支持编译器创建的一些指令。然而,现在只要编译一个带有默认设置的程序就可以在所有(Intel) cpu上运行。如果您确实知道您的目标机器使用的是一个非常不同或更旧的CPU,您可以添加-march=…编译器选项,以便编译器生成的指令一定能在目标机器上工作。

最后,DOSBox 不是一个Windows模拟器,它是一个DOS模拟器。这两种制度虽然历史悠久,但却截然不同。DOSBox不是为运行本机Windows应用程序而设计的,它是为运行本机DOS应用程序而设计的(这些天大多数都是废弃软件)。如果你想在Linux上运行DOS程序,比如Dangerous Dave(我怀旧的最爱之一),那么你可以。但是,如果您希望运行Windows应用程序,则需要为此目的设计一个模拟器,例如WINE。

作为参考,DOS使用过时的MZ Executable格式。

  1. pausecls很可能不能直接在其他操作系统中工作,因为这些是Windows/dos特定的命令。

  2. 如果您删除了dos特定的命令并使程序通用,那么Windows内置的EXE文件很可能可以通过Wine在Linux或MacOS中执行。请参阅http://www.winehq.org/about/和http://wiki.winehq.org/MacOSX。我说"最有可能"是因为你还需要尝试一下,看看是否有问题。

  3. 如果你运行你的EXE可执行文件在一个虚拟的环境中运行Windows在它像虚拟盒子,那么它将工作

  4. 在Linux操作系统下,清除屏幕的命令为clear。你真的打算这么做吗?