Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么linux编译的程序不能在Windows上运行_C_Linux_Windows - Fatal编程技术网

C 为什么linux编译的程序不能在Windows上运行

C 为什么linux编译的程序不能在Windows上运行,c,linux,windows,C,Linux,Windows,我几乎可以肯定我的问题是由于编译后的程序被编译为linux可执行文件,但我只想再次检查一下这一点 #include <stdio.h> #include <stdlib.h> int main() { printf("Hello world!\n"); return EXIT_SUCCESS; } #包括 #包括 int main() { printf(“你好,世界!\n”); 返回退出成功; } 上面的“程序”应该可以在Windows和Linux上编

我几乎可以肯定我的问题是由于编译后的程序被编译为linux可执行文件,但我只想再次检查一下这一点

#include <stdio.h>
#include <stdlib.h>
int main()
{
    printf("Hello world!\n");
    return EXIT_SUCCESS;
}
#包括
#包括
int main()
{
printf(“你好,世界!\n”);
返回退出成功;
}

上面的“程序”应该可以在Windows和Linux上编译,因为它与源代码兼容,因为没有特定于操作系统的库或类似的东西

然而,当我在Linux机器上输入“c99 hello.c-o hello.exe”,然后将“可执行文件”传输到windows机器时,它拒绝运行。据我所知,Linux生成一个只在Linux上运行的可执行文件,因此添加“.exe”无效。要在Linux for Windows上构建该程序,我需要在Windows机器上重新编译该程序?
或者还有其他更简单的方法可以使用吗?

Windows和Linux可执行文件使用两种不同的不兼容格式:

在Windows上,它是

在Linux上,它是最重要的

每种格式都利用了它们应该运行的操作系统的特性,因此它们通常不能在另一个平台上执行

此外,可执行文件只包含加载到内存后执行的代码的一小部分。可执行文件链接到系统库,这些库提供了允许程序与系统交互的大部分功能。
由于系统之间的差异很大,库也各不相同,并且用于Linux的程序不能在FreeBSD上运行,尽管后者也使用ELF,因为它们没有链接到相同的库

要在Linux上编译Windows可执行文件,可以使用一种称为交叉编译的技术。 编译器毕竟只是一个写入二进制文件的程序,因此理论上任何编译器都可以为任何平台编写代码,只要目标系统的库可以链接

该项目提供了一个工具链,允许这样做。 例如,您可以使用
sudo apt get install mingw-w64
命令在基于debian的系统上安装它

已安装的可执行文件可按如下方式使用:

i686-w64-mingw32-gcc hello.c -o hello32.exe      # 32-bit
x86_64-w64-mingw32-gcc hello.c -o hello64.exe    # 64-bit

这是一种编译情况,与java.exe不同,它没有任何虚拟机来解释不同操作系统中的代码。然后,他需要从操作系统中获得所有特定的.dll和lib来执行为他设计的作业


在.exe中,所有东西都是在特定的操作系统上运行的,在Java中,虚拟机是在不同的操作系统上解释和运行代码的魔法。

您(基本上)理解正确。不同操作系统上的可执行文件有不同的格式(和不同的执行模式)。另一种方法称为“交叉编译”。回答标题问题:同样的原因,柴油发动机不会使用无铅汽油,反之亦然。它们是不同的系统。除了不同的文件格式(ELF与Windows上的“可移植可执行文件”格式)之外,这两个操作系统还具有不同的应用程序二进制接口(ABI)。“没有操作系统特定的库”该库用于什么
printf
?每个系统使用不同的方式将字符打印到控制台。此外,不仅二进制格式不同,ABI也不同。请注意,这并不重要:例如,OpenBSD和Linux都使用ELF作为二进制文件,但您无法在OpenBSD上执行Linux二进制文件。另一方面,您可以在Linux上通过Wine和XXL的帮助执行Windows二进制文件。不过,我相信OpenBSD有一个compat_linux仿真层,它允许linux二进制文件在那里运行。真正的答案是,二进制试图与之交互的操作系统不同,除非存在某种系统调用转换层,否则二进制无法运行。