相关疑难解决方法(0)

为什么需要为每个操作系统重新编译 C/C++?

这更像是一个理论问题。我是 Comp sci 专业,对低级编程非常感兴趣。我喜欢了解引擎盖下的工作原理。我的专长是编译器设计。

无论如何,当我正在开发我的第一个编译器时,我遇到了一些令人困惑的事情。

当您用 C/C++ 编写程序时,人们知道的传统事情是,编译器神奇地将您的 C/C++ 代码转换为该机器的本机代码。

但有些事情并没有在这里加起来。如果我针对 x86 架构编译我的 C/C++ 程序,那么相同的程序似乎应该在具有相同架构的任何计算机上运行。但这不会发生。您需要为 OS X 或 Linux 或 Windows 重新编译您的代码。(再次为 32 位与 64 位)

我只是想知道为什么会这样?我们在编译 C/C++ 程序时不是针对 CPU 架构/指令集吗?Mac 操作系统和 Windows 操作系统可以在完全相同的架构上运行。

(我知道 Java 和类似的目标是 VM 或 CLR,所以这些不算数)

如果我对此给出了最佳答案,我会说 C/C++ 必须编译为特定于操作系统的指令。但是我读到的每个来源都说编译器针对机器。所以我很困惑。

c c++ winapi compilation

71
推荐指数
5
解决办法
4415
查看次数

收到错误:bash:(程序):无法执行二进制文件:Exec 格式错误,在 32 位和 64 位 Windows 上

有一个为语言研究开发的程序(http://people.csail.mit.edu/mcollins/code.html)。当我尝试在 Windows 上使用 Git bash 终端运行解析器时,出现错误:

bash: cannot execute binary file: Exec format error.
Run Code Online (Sandbox Code Playgroud)

首先,我认为这是因为我的 64 位操作系统,因为该文件是 32 位的。因此,我在 32 位系统上尝试了该程序,但得到了相同的消息。

关于如何解决这个问题有什么想法吗?:

file (program)显示:

ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.2.5, with debug_info, not stripped
Run Code Online (Sandbox Code Playgroud)

uname -srv对于我的 64 位操作系统,显示:

MINGW64_NT-10.0-19042 3.1.7-340.x86_64 2021-03-26 22:17 UTC
Run Code Online (Sandbox Code Playgroud)

uname -srv对于我的 32 位操作系统,显示:

MINGW32_NT-6.1-7601 3.1.7-340.i686 2021-03-26 22:01 UTC
Run Code Online (Sandbox Code Playgroud)

PS:如果你想尝试一下,这段代码应该可以在程序目录中运行,但它对我不起作用:

gunzip -c models/model2/events.gz | code/parser examples/sec23.tagged models/model2/grammar 10000 1 1 1 1 …
Run Code Online (Sandbox Code Playgroud)

unix windows bash executable elf

8
推荐指数
1
解决办法
9万
查看次数

在什么范围的机器上的二进制兼容性?

我在C中编写了一个简单的程序,并在Ubuntu上使用GCC编译它.这个文件会在另一台机器上运行吗?

  • 输出二进制文件的内容及其外部依赖项是什么?
  • 它可以在其他Linux发行版上运行,在什么情况下运行?
  • 它可以在其他操作系统上运行吗?

c compiler-construction ubuntu shared-libraries

5
推荐指数
1
解决办法
356
查看次数