【问题标题】:Windows executable got executed on my linuxWindows 可执行文件在我的 linux 上执行
【发布时间】:2021-02-14 18:13:03
【问题描述】:

我编写了一个简单的代码并在 .exe 格式的 linux 中使用 g++ 编译,令人惊讶的是它在我的 linux 终端中执行。你能说一下这个原因吗? linux终端可以执行任何格式的机器代码吗?我可以在 Windows 中运行相同的程序吗? 代码:

#include<iostream>
using namespace std;
int main(){
    cout<<"Hello World !"<<endl;
    return 0;
}

编译代码:

g++ main.cpp -o program.exe

操作系统:Linux Mint 20 肉桂。 我通过输入./program.exe来执行

【问题讨论】:

  • 啊,不,这不是构建 Windows 可执行文件。仅仅因为您将其命名为 exe 并不能使其成为 Windows 二进制文件。它仍然是一个普通的 Linux 可执行文件。 Linux 不在乎你给文件起什么名字。
  • 所以这不会在 Windows 上运行吗?
  • 在 Linux 等 POSIX 系统中,文件名没有特殊格式。您可以为您的程序命名任何您喜欢的名称。 .exe 后缀只是文件名的一部分,它不会告诉编译器或链接器生成特定格式的程序。
  • 没错。它不会在 Windows 上本地运行。
  • 遗憾的是,在您的本田汽车侧面涂上“Space-X”并不能将它开到火星。

标签: c++ linux g++ exe


【解决方案1】:

问:我写了一个简单的代码,并在 linux 中使用 g++ 编译成 .exe 格式,令人惊讶的是它在我的 linux 终端中执行了

A:没有什么“令人惊讶”的。我假设你在 Linux 下编译它?那么为什么不能在 Unix 下运行它呢?

问:我在 Windows 上构建的 .exe 能否在 Linux 上运行(如果我复制了二进制文件)? A:简短的回答:没有。

更长的答案:您可以安装 Wine 以在 Linux 上运行 Windows 应用程序。

问:我在 Ubuntu 上构建的 .exe 可以在 Windows 上运行吗?答:没有。

问:我在 Ubuntu 上构建的可执行文件是否需要后缀为 .exe?答:不。文件后缀无关紧要。

问:我在 Windows 上构建的可执行文件是否需要后缀为 .exe?答:是的。


回答您的其他问题:

为一个平台构建的 .exe 无法在不同平台上加载或运行的原因有很多。

  • Sam Varshavchik 说得好:

这与您的 Toyota 的散热器不适合 闪避

  • 更重要的是,"executable image" 不仅仅是“机器代码”。

  • .exe 是“可执行图像”的一个示例。它们有许多不同的格式:https://en.wikipedia.org/wiki/Category:Executable_file_formats。这些格式中的大多数都是特定于平台的。

  • 操作系统必须为loaded 才能成为运行中的process。这也是特定于平台的。

  • 正在运行的进程将需要文件 I/O、内存和共享库等资源,这些资源也是特定于平台的。

希望对你有帮助……

【讨论】:

  • 感谢您为我解惑。所以编译器对于不同的操作系统是不同的,对吗?但是最后都是机器码,为什么不能在任何平台上运行呢?
  • @ManjunathBhat So the compiler is different for different os right ? 部分,是的。 But finally they are in machine code, then why they cannot run in any platform ?因为系统API和ABI不同。
  • @Manjunath Bhat:“可执行映像”不仅仅是“机器代码”。为一个平台构建的 .exe 无法在不同平台上加载或运行的原因有很多。请参阅上面的更新以获取一些示例。
【解决方案2】:

由于您在 Linux 上使用 g++ 编译了代码,您应该可以在 Linux 上运行它,但它不能在 Windows 上运行,因为二进制可执行文件是为 Linux 编译的。

在 Windows 上,.exe 是可执行文件的扩展名,但二进制代码必须针对 Windows 进行编译才能运行。在 Linux 上,您可以使用任何扩展名,.mp4 或任何扩展名,并且在终端中键入 ./program.mp4 时它仍然会运行。

【讨论】:

  • 但最后都是机器码,为什么不能在任何平台上运行?
  • 这与您的丰田散热器不适合道奇的原因相同。
  • 关于在不同操作系统上执行,Linux使用ELF格式,Windows使用PE格式。您编译的是 ELF 二进制文件,因此它不会在 Windows 上运行。操作系统也有不同的内核 API,因此 Linux 可执行文件不会在 Windows 上运行。
猜你喜欢
  • 2018-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-23
  • 1970-01-01
  • 2014-02-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多