你能在 windows 上运行用 linux 制作的 exe 文件吗

你能在 windows 上运行用 linux 制作的 exe 文件吗

我在我的 Linux 机器上编译了 c 文件并将其命名为 test.exe,可以在 Windows 上运行该文件吗?

答案1

我在我的 Linux 机器上编译了 c 文件并将其命名为 test.exe,可以在 Windows 上运行该文件吗?

答案很简单:不,至少有两个原因。
(此答案假设不涉及 Windows Subsystem for Linux。)

  1. Linux 中的可执行文件通常使用极低频,Executable_and_Linkable_Format。还有较旧的柯夫特.
    而 Windows 使用或曾经使用过串口操作系统东北聚乙烯, 和PE32+
    https://en.wikipedia.org/wiki/Comparison_of_executable_file_formats

典型的编译和链接的可执行文件不是可以加载(即从存储设备复制到内存中)然后简单执行的独立二进制映像。
相反,可执行文件通常被组织成代码、数据、符号信息和库要求的部分。
这些信息的布局必须能够被操作系统的链接器/加载器实用程序识别,该实用程序负责启动用户程序。

重命名执行文件不会改变该文件的格式以使其与其他操作系统兼容。

  1. Linux 和 Windows 的 C 库不兼容。C
    是一种高级语言,只能在源代码级别移植。
    一旦源代码被编译,目标代码就会依赖于编译器所针对的处理器架构以及代码被编译的 C 库。

C 语言的许多功能都是作为配套 C 库中的函数和过程实现的。子字符串、数学和输入/输出例程都包含在 C 程序可以使用的 C 库中。
是的,可以编写 C 程序以避免调用几乎所有 C 库例程。但有一个关键例程可以初始化与主机操作系统兼容的 C 运行时环境。此 C 运行时环境包括堆栈、堆和变量/数据初始化。

由于 C 程序依赖于配套的 C 库(该库本身依赖于操作系统和 CPU 架构),因此该 C 程序一旦编译就会继承相同的依赖关系。

答案2

我查找了一些 C 示例,它们声称是在 Linux 中编译的。我查找了没有特殊 Linux 函数或钩子的示例。

如果情况确实如此,并且源代码是平淡的标准 C,那么它应该可以工作,因为 C 具有合理的可移植性。

您需要尝试它并查看它是否有效,并在必要时在 Windows 中重新编译。

以下是可在不同环境中运行的可移植 C 代码的方法,您可能会觉得有用。

当程序仅使用定义的行为(没有未定义、未指定或实现定义的行为)时,该程序由语言标准(在您的情况下是 C 语言标准)保证编译(使用符合标准的编译器)并在所有操作系统上统一运行。

基本上,你必须明白,像 C 这样的语言标准或像 OpenGL 这样的库标准提供了一组程序员可以制定和构建的最低可假设保证。只要编译器符合标准(对于库,实现符合标准),并且程序没有陷入未定义的行为,这些就不会改变

可移植的 C 代码

相关内容