我在我的 Linux 机器上编译了 c 文件并将其命名为 test.exe,可以在 Windows 上运行该文件吗?
答案1
我在我的 Linux 机器上编译了 c 文件并将其命名为 test.exe,可以在 Windows 上运行该文件吗?
答案很简单:不,至少有两个原因。
(此答案假设不涉及 Windows Subsystem for Linux。)
- Linux 中的可执行文件通常使用极低频,Executable_and_Linkable_Format。还有较旧的柯夫特.
而 Windows 使用或曾经使用过串口,操作系统,东北,聚乙烯, 和PE32+。
看https://en.wikipedia.org/wiki/Comparison_of_executable_file_formats
典型的编译和链接的可执行文件不是可以加载(即从存储设备复制到内存中)然后简单执行的独立二进制映像。
相反,可执行文件通常被组织成代码、数据、符号信息和库要求的部分。
这些信息的布局必须能够被操作系统的链接器/加载器实用程序识别,该实用程序负责启动用户程序。
重命名执行文件不会改变该文件的格式以使其与其他操作系统兼容。
- 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 这样的库标准提供了一组程序员可以制定和构建的最低可假设保证。只要编译器符合标准(对于库,实现符合标准),并且程序没有陷入未定义的行为,这些就不会改变