📜  如何在C和C++中的64位gcc上编译32位程序

📅  最后修改于: 2021-05-25 20:49:49             🧑  作者: Mango

现在大多数使用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
......................
......................

因此,第四行目标: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:

For C language:
sudo apt-get install gcc-multilib
For C++ language:
sudo apt-get install g++-multilib

之后,您将能够在64位系统上编译32位二进制文件。

添加“ -m32”标志后如何检查程序是否用32位编译?
好吧,我们可以通过以下程序轻松地进行检查。

// C program to demonstrate difference
// in output in 32-bit and 64-bit gcc
// File name: geek.c
#include
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 *等))的大小取决于编译器,因此它将根据编译器的位生成不同的输出。

想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。