2

疑问

我在 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 机器产生任何影响。

4

2 回答 2

4

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

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

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

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

编辑:我应该在这里补充一点,第 1 点假设第 2 点已经被克服。第 2 点是一个操作系统上的可执行文件在其他操作系统上简单“不起作用”的原因。


回复评论:

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

这里的例外是,如果您在具有最新 CPU 的机器上编译程序,并希望在具有非常旧 CPU 的机器上运行它,那么旧 CPU 可能不支持编译器创建的某些指令。但是,现在仅使用默认设置编译程序通常适用于所有(英特尔)CPU。如果您知道您的目标机器使用非常不同或更旧的 CPU,您可以添加-march=...编译器选项,以便编译器生成绝对可以在目标机器上运行的指令。

最后,DOSBox不是一个 Windows 模拟器,它是一个 DOS 模拟器。这两个系统,尽管它们的历史,是完全不同的。DOSBox 不是为运行原生 Windows 应用程序而设计的,它是为运行原生 DOS 应用程序而设计的(其中大部分是废弃软件)。如果您想在 Linux 上运行 DOS 程序,例如Dangerous Dave(我怀旧的最爱之一),那么您可以。但是,如果您希望运行 Windows 应用程序,则需要为此目的设计的模拟器,例如WINE

作为参考,DOS 使用过时的MZ 可执行文件格式

于 2013-03-06T09:21:50.903 回答
0
  1. pause并且cls很可能不会直接在其他操作系统中工作,因为这些是 Windows/DOS 特定的命令。

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

  3. 如果您在运行 Windows 的虚拟化环境(如Virtual Box )中运行您的 EXE 可执行文件,那么它将工作。

  4. 在 Linux 上,清除屏幕的命令是clear. 你真的打算这样做吗?

于 2013-03-06T10:00:12.193 回答