我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第13篇文章,点击查看活动详情
主要是 C 和 C++ 的编译器(gcc 或 clang),现在带有默认的 64 位版本。好吧,就速度而言,这将是一个不错的选择。但是,如果有人想以32 位而不是64 位的方式运行他们的程序以进行测试或调试,则会导致问题。因此,我们必须对此有所了解。在继续之前,让我们确认我们的系统中当前安装了
哪个位版本的gcc 。
只需在 Linux 终端上键入以下命令。
Command: gcc -v
Output
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper
Target: x86_64-linux-gnu
......................
......................
因此第四行Target: x86_64-linux-gnu确认我们正在运行 64 位 gcc。
现在为了使用 32 位 gcc 进行编译,只需在编译“C”语言程序的命令行中添加一个标志**-m32**。例如,要通过 Linux 终端编译geek.c文件,您必须编写以下带有**-m32**标志的命令。
Command: gcc -m32 geek.c -o geek
如果您收到如下错误:
fatal error: bits/predefs.h: No such file or directory
然后它表明缺少 gcc 的标准库。在这种情况下,您必须使用以下命令 安装gcc-multlib :
对于 C 语言:
sudo apt-get install gcc-multilib
对于 C++ 语言:
sudo apt-get install g++-multilib
之后,您将能够在 64 位系统上编译 32 位二进制文件。
添加“-m32”标志后如何检查程序是否使用32位编译?
好吧,我们可以通过以下程序轻松检查这一点。
演示 32 位和 64 位 gcc 输出差异的 C++ 程序
// 文件名:geek.c
#include<iostream>
using namespace std;
int main()
{
cout << "Size = " << sizeof(size_t);
}
演示 32 位和 64 位 gcc 输出差异的 C 程序
// 文件名:geek.c
#include<stdio.h>
int main()
{
printf("Size = %lu", sizeof(size_t));
}
在Linux中通过这两个不同的命令编译上面的程序,
默认64位编译,
Input: gcc -m64 geek.c -o out
Output: ./out
Size = 8
强制 32 位编译,
Input: gcc -m32 geek.c -o out
Output: ./out
Size = 4
我们可以从上面的程序中得出任何结论吗?是的,也许,让我们试着了解更多。
由于long、size_t、指针数据类型(int*、char* 等)等数据类型的大小取决于编译器,因此它将根据编译器的位生成不同的输出。