简体   繁体   English

为什么linux编译的程序不适用于Windows

[英]Why does a linux compiled program not work on Windows

I am almost sure my problem is due to the fact that the compiled program is compiled as a linux executable, but I just want to double check this. 我几乎可以肯定我的问题是因为编译的程序被编译为linux可执行文件,但我只是想仔细检查一下。

#include <stdio.h>
#include <stdlib.h>
int main()
{
    printf("Hello world!\n");
    return EXIT_SUCCESS;
}

The above "program" should compile on Windows and Linux just fine, since it is source code compatible, as there are no operating system specific libraries or anything like that. 上面的“程序”应该在Windows和Linux上编译得很好,因为它与源代码兼容,因为没有特定于操作系统的库或类似的东西。

Yet, when I type in "c99 hello.c -o hello.exe" on my Linux box, and then transfer that "executable" to a windows machine, it refuses to run. 然而,当我在我的Linux机器上键入“c99 hello.c -o hello.exe”,然后将该“可执行文件”传输到Windows机器时,它拒绝运行。 From what I understand, Linux generates an executable file that only runs on linux, so adding ".exe" has no effect. 根据我的理解,Linux生成一个只能在linux上运行的可执行文件,因此添加“.exe”无效。 To build that program on Linux for Windows, I would need to recompile that program on a Windows machine? 要在Linux for Windows上构建该程序,我需要在Windows机器上重新编译该程序吗? Or is there another simpler method that will work? 或者还有另一种更简单的方法吗?

Windows and Linux executable files use two different incompatible formats: Windows和Linux可执行文件使用两种不同的不兼容格式:

On Windows, it is the Portable Executable format . 在Windows上,它是可移植可执行文件格式

On Linux it is the ELF (Executable and Linkable Format) . 在Linux上,它是ELF(可执行和可链接格式)

Each format makes uses of the specificities of the OS they are supposed to run on, so they can't normally be executed on another platform. 每种格式都使用了它们应该运行的操作系统的特性,因此它们通常不能在另一个平台上执行。

Also, an executable only contains a small portion of the code that is executed after it is loaded into memory. 此外,可执行文件仅包含在加载到内存后执行的一小部分代码。 An executable file is linked to system libraries that provide most of the functionality that allows the program to interact with the system. 可执行文件链接到系统库,系统库提供允许程序与系统交互的大多数功能。
As systems are very different from each other, libraries vary, and a program for say, Linux, cannot be run on FreeBSD despite the latter using also ELF, because they are not linked to the same libraries. 由于系统彼此差异很大,因此Linux的程序不能在FreeBSD上运行,尽管后者也使用ELF,因为它们没有链接到相同的库。

To compile a Windows executable on Linux, a technique known as cross-compilation can be used. 要在Linux上编译Windows可执行文件,可以使用称为交叉编译的技术。 A compiler is after all just a program that writes into a binary file, so any compiler can in theory write code for any platform, as long as the target system's libraries are available to be linked against. 编译器毕竟只是一个写入二进制文件的程序,因此任何编译器理论上都可以为任何平台编写代码,只要目标系统的库可以链接即可。

The MinGW-w64 project provides a toolchain that allows this. MinGW-w64项目提供了一个允许这样做的工具链。 For example, you can install it on debian-based systems using the sudo apt-get install mingw-w64 command. 例如,您可以使用sudo apt-get install mingw-w64命令在基于debian的系统上安装它。

The installed executables can be used like this: 安装的可执行文件可以像这样使用:

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

Its a compilation situation, diferently from java .exe don't have any virtual machine to interpret the code in diferent OS. 它是一个编译情况,与java .exe不同,没有任何虚拟机来解释不同操作系统中的代码。 Then he needs to have all specific .dll's and lib's from OS to execute the job who is made for. 然后他需要从操作系统中获取所有特定的.dll和lib来执行所需的工作。

In .exe all things are made to run on a specific OS, other way in Java a virtual machine is the magic who interpret and run your code on diferents OS. 在.exe中,所有东西都在特定的操作系统上运行,而在Java中,虚拟机是在不同的操作系统上解释和运行代码的神奇之处。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 linux中的C编译程序在那里运行但不在windows中 - C compiled program in linux run there but does not in windows 为什么这个C程序在Windows上编译时会显示不同的输出? - Why does this C program display different output when compiled on Windows? 为什么此OpenMP代码在Linux上却不能在Windows上运行? - Why does this OpenMP code work on Linux, but not Windows? Integer:为什么它在 Linux 上工作而不在 Windows 上工作 - Integer: Why does it work on Linux and not on Windows 为什么linux线程函数在windows中有效? - Why does a linux thread function work in windows? 如何制作可以在gcc(Linux)和VS(Windows)中编译的程序? - How to make program which can be compiled in gcc (Linux) and VS (Windows)? 程序挂在Linux和Windows上,似乎可以在Mac上运行 - Program hangs on Linux and Windows, Seems to work on Mac “在Linux中编写C可编译可执行的程序+用makefile编译”是什么意思? - What does "writing C program that can be compiled and executable in Linux + compiled with makefile" mean? 为什么以下程序有效 - why does following program work 为什么我的程序可以通过直接运行而不是作为服务来正常运行? Linux C - Why does my program work fine by running it directly but not as a service? Linux C
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM