【问题标题】:Compiling C/C++ source code on Linux for different platforms在 Linux 上为不同平台编译 C/C++ 源代码
【发布时间】:2023-04-06 11:50:01
【问题描述】:

我已经阅读了一些关于在 Linux 上编译 C/C++ 源代码以便在 Windows 上运行它们的内容。我也用 MinGW 尝试过,一切正常。

但是,我不明白为什么必须在 Linux 上使用 MinGW 来制作可在 Windows 上运行的二进制文件。是什么让 g++ 输出无法在 Windows 上运行?还有什么使 g++ 输出可以在 Linux 上运行它们?输出文件是否有不同的结构:标题、数据等,它们只能由特定的操作系统解释?

谁能帮我说清楚?如果你们中的任何人能向我解释这一点,我将不胜感激,不仅作为业余爱好者,而且作为对操作系统感兴趣并想知道这背后真正意义的人。

【问题讨论】:

  • en.wikipedia.org/wiki/Comparison_of_executable_file_formats - 每个操作系统系列或多或少都有自己的。
  • Does the output file have a different structure: header, data etc and they can be interpreted only by a specific operating system? 是的。而且,可用的环境和库也完全不同(例如,程序启动时需要执行什么等)
  • x86 Linux versus Windows?的可能重复
  • 不存在任何称为 C/C++ 的语言。
  • 您究竟希望您的 Linux 系统在哪里拥有所有在 MS Windows 上运行的可执行文件必须链接的所有 MS Windows 库?它们不会凭空出现在您的 Linux 系统上。这就是 MinGW 安装的。

标签: c++ linux windows operating-system cross-compiling


【解决方案1】:

在 Linux 上为 Windows 构建二进制文件相当于交叉编译,就像在 Linux 上为 Android 等构建二进制文件一样。 Windows 和 Linux 机器可能(也许)具有相似的硬件,但它们是非常不同的操作平台。

当您执行像prinf("Hello world") 这样简单的事情时,平台级别会发生什么,这在平台之间会有所不同。也就是说,将角色呈现给控制台的方式是不同的。当涉及到像fork() 这样的调用时,挑战更大,这与 Windows 进程管理所做的任何事情都不对应。

我相信即使是在 Windows 和 Linux 之间将程序代码和数据加载到内存中的方式也不同,即使在相同的硬件上也是如此。

没有什么特别的理由认为为一个平台构建的本机二进制文件可以在另一个平台上运行。使用 Java,我们已经习惯了编译后的代码是跨平台的,但是 Java .class 文件中的不是本地可执行代码——我们依靠 Java 运行时系统来完成平台级别的正确事情。使用 C/C++,我们需要构建工具来做到这一点(通常还需要一些程序员的专业知识)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多