在Windows上编译的控制台应用程序是否可以使用DOSBox在Linux和MAC OS X上运行?
Will console applications compiled on Windows work on Linux and MAC OS X using DOSBox?
疑点
我在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机器有任何影响。
这个程序不能在其他机器上运行的原因有几个——我将总结两个主要的原因:
-
使用其他操作系统不支持的系统指令。如果你试图在不同的操作系统上运行这些指令,操作系统会抱怨它不理解这些指令,程序会崩溃。
-
(可能更重要的是,)您创建的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格式。
-
pause
和cls
很可能不能直接在其他操作系统中工作,因为这些是Windows/dos特定的命令。 -
如果您删除了dos特定的命令并使程序通用,那么Windows内置的EXE文件很可能可以通过Wine在Linux或MacOS中执行。请参阅http://www.winehq.org/about/和http://wiki.winehq.org/MacOSX。我说"最有可能"是因为你还需要尝试一下,看看是否有问题。
-
如果你运行你的EXE可执行文件在一个虚拟的环境中运行Windows在它像虚拟盒子,那么它将工作
-
在Linux操作系统下,清除屏幕的命令为
clear
。你真的打算这么做吗?
- 如何在 Mac 上正确编译C++,当它在 Linux 上编译没有问题时?
- 编译在我的 Mac 上工作,但在集群 (Linux) 上不起作用
- 为什么 SDL 在 Mac 上比 Linux 慢得多?
- 如何从支持linux/mac操作系统的第三方代码为我的c#项目创建dll
- 适用于win32、linux、mac的POSIX C包装器
- 如何使用 clang 和 distcc 在不同架构(例如 Mac/Linux)的从属服务器上编译
- 在Mac OS X Mountain Lion(或更高版本)和Linux上使用X11/Xlib.h
- Cmake Mac OSX库链接问题:在Linux上进行编译,但在Mac上进行了编译
- 线程不在 Linux 上终止,但在 Mac 上终止
- GCC 编译器对类型转换有什么作用?为什么 mac 和 Linux 上的输出不同
- NetBeans C++ Cross-Plattform(Mac和Linux)同时与Git
- mac构建有一个未定义的符号,而linux构建并没有用于相同的代码
- 在 linux/mac 中获取多字节字符的"char"
- Linux与Mac上的四倍精度
- Mac和Linux机器之间的正则兼容性问题
- 适用于大文件和 512 KB 块的最快和轻量级哈希算法 [C,Linux,MAC,Windows]
- C++Mac上使用Linux库(x86_64-Apple-Darwin上的elf64-x86-64)
- 如何在 Linux/Mac 上调用特定的 EXE 函数
- Linux C++ 如何以编程方式获取 LAN 上所有适配器的 MAC 地址
- 在Linux/Mac上使用c++检测/等待用户登录