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?
非常感谢有人花时间回答我的上述问题。提前致谢!
i686 是对用于 Pentium Pro 和 Pentium II 处理器的 Intel CPU 架构的引用。这也意味着目标是 32 位 x86 代码而不是 64 位 x86 代码。
您需要修复安装,因为安装的编译器与安装的汇编器不兼容。您不需要使用 -m32 或 -m64 选项来编译 hello world 程序。
问题是您的编译器与您的汇编程序不兼容。您的编译器只能生成 32 位代码,但您的汇编程序默认采用 64 位代码。您的编译器错误地假定您的汇编器默认为 32 位,因此没有传递允许汇编器使用 32 位代码的必要选项。
这意味着您的编译器无法生成 64 位代码。
构建 GCC(您正在使用的编译器)的第一步是 运行 源代码中包含的配置脚本。此行显示配置脚本是如何 运行,包括使用了哪些参数。
因为您计算机上安装的 GCC 版本仅针对 32 位构建。它将在 32 位模式下 x86_64 CPU 运行,并且使用兼容的汇编器,它可以生成 运行 在 x86_64 上的代码CPU 在 32 位模式下。
我不知道为什么你的编译器 and/or 汇编器安装不正确或如何修复它。
我正在尝试编译 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?
非常感谢有人花时间回答我的上述问题。提前致谢!
i686 是对用于 Pentium Pro 和 Pentium II 处理器的 Intel CPU 架构的引用。这也意味着目标是 32 位 x86 代码而不是 64 位 x86 代码。
您需要修复安装,因为安装的编译器与安装的汇编器不兼容。您不需要使用 -m32 或 -m64 选项来编译 hello world 程序。
问题是您的编译器与您的汇编程序不兼容。您的编译器只能生成 32 位代码,但您的汇编程序默认采用 64 位代码。您的编译器错误地假定您的汇编器默认为 32 位,因此没有传递允许汇编器使用 32 位代码的必要选项。
这意味着您的编译器无法生成 64 位代码。
构建 GCC(您正在使用的编译器)的第一步是 运行 源代码中包含的配置脚本。此行显示配置脚本是如何 运行,包括使用了哪些参数。
因为您计算机上安装的 GCC 版本仅针对 32 位构建。它将在 32 位模式下 x86_64 CPU 运行,并且使用兼容的汇编器,它可以生成 运行 在 x86_64 上的代码CPU 在 32 位模式下。
我不知道为什么你的编译器 and/or 汇编器安装不正确或如何修复它。