C++基础(13)如何在 C 和 C++ 中在 64 位 gcc 上编译 32 位程序

920 阅读2分钟

我报名参加金石计划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* 等)等数据类型的大小取决于编译器,因此它将根据编译器的位生成不同的输出。