i686 是 32 位的吗?为什么我的 gcc/g++ 无法编译 .cpp 和 .c 文件?

Is i686 32 bit? Why does my gcc/g++ fail compiling .cpp and .c files?

我正在尝试编译 helloworld.c 代码

#include<stdio.h>
 int main(){
 printf("Hello World");
 return 0;
 }

在 Linux 机器上。下面是 uname- 机器的结果,表明机器是 64 位的。

uname-a : Linux pascal 2.6.32-358.23.2.el6.x86_64 #1 SMP Sat Sep 14 05:32:37 EDT 2013 x86_64 x86_64 x86_64 GNU/Linux

在 运行 中使用 gcc 命令时出现以下错误:

 [pascal]/user/gasharma/workspaceC++:/>gcc -c helloworld.c

 /tmp/ccpg1Atk.s: Assembler messages:
 /tmp/ccpg1Atk.s:11: Error: suffix or operands invalid for `push'
 /tmp/ccpg1Atk.s:12: Error: suffix or operands invalid for `push'
 /tmp/ccpg1Atk.s:14: Error: suffix or operands invalid for `push'
 /tmp/ccpg1Atk.s:20: Error: suffix or operands invalid for `pop'
 /tmp/ccpg1Atk.s:21: Error: suffix or operands invalid for `pop'

这是 gcc -v 的输出:

 [pascal]/user/gasharma/workspaceC++:/>gcc -v
 Using built-in specs.
 Target: i686-pc-linux-gnu
 Configured with: ../gcc-4.2.4/configure --prefix=/usr/local --with-gmp=/usr/local --with-mpfr=/usr/local
 Thread model: posix
 gcc version 4.2.4

仔细检查以上内容,我发现目标是 i686(我不确定是 32 位还是 64 位)。我强烈猜测它是 32 位的。我用谷歌搜索了一段时间,结果表明问题可能出在 64 位机器上的 32 位编译器上。然而,一些结果也指出使用 -m32 和 -m64 选项来执行成功的编译 运行.

我用 -m64 做了一个 gcc 运行,它导致了下面的错误。

 [pascal]/user/gasharma/workspaceC++:/>gcc -c -m64 helloworld.c
 helloworld.c:1: sorry, unimplemented: 64-bit mode not compiled in

我这里有六个问题:

1)目标中的i686代表32位还是64位机?我怎样才能做出这种区分?一般i386指32位,x86_64指64位。

2) 在我的案例中,如何 运行 一个简单的 helloworld.c?何时、为何以及如何使用 -m32 和 -64 选项?

3) 这与汇编程序或编译程序有关吗?

4) "sorry, unimplemented: 64-bit mode not compiled in" 意味着什么?

5) "Configured with: ../gcc-4.2.4/configure --prefix=/usr/local --with-gmp=/usr/local --with-mpfr=/usr/local"是什么意思?

6)为什么我是运行宁64位机器时目标机器不在gcc下x86_64?

非常感谢有人花时间回答我的上述问题。提前致谢!

  1. i686 是对用于 Pentium Pro 和 Pentium II 处理器的 Intel CPU 架构的引用。这也意味着目标是 32 位 x86 代码而不是 64 位 x86 代码。

  2. 您需要修复安装,因为安装的编译器与安装的汇编器不兼容。您不需要使用 -m32 或 -m64 选项来编译 hello world 程序。

  3. 问题是您的编译器与您的汇编程序不兼容。您的编译器只能生成 32 位代码,但您的汇编程序默认采用 64 位代码。您的编译器错误地假定您的汇编器默认为 32 位,因此没有传递允许汇编器使用 32 位代码的必要选项。

  4. 这意味着您的编译器无法生成 64 位代码。

  5. 构建 GCC(您正在使用的编译器)的第一步是 运行 源代码中包含的配置脚本。此行显示配置脚本是如何 运行,包括使用了哪些参数。

  6. 因为您计算机上安装的 GCC 版本仅针对 32 位构建。它将在 32 位模式下 x86_64 CPU 运行,并且使用兼容的汇编器,它可以生成 运行 在 x86_64 上的代码CPU 在 32 位模式下。

我不知道为什么你的编译器 and/or 汇编器安装不正确或如何修复它。