使用 C 和 C++ 在 64 位 gcc 上编译 32 位程序


如今,编译器附带默认的 64 位版本。有时我们需要将代码编译并执行到某些 32 位系统中。在此时,我们必须使用此功能。

首先,我们必须检查 gcc 编译器的当前目标版本。要检查此内容,我们必须键入此命令。

gcc –v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
...........
...........
...........

此处显示目标为 x86_64。因此,我们正在使用 64 位版本的 gcc。现在要使用 32 位系统,我们必须编写以下命令。

gcc –m32 program_name.c

有时此命令可能会产生如下一些错误。这表示缺少 gcc 的标准库。在这种情况下,我们必须安装它们。

In file included from test_c.c:1:0:
/usr/include/stdio.h:27:10: fatal error: bits/libc-header-start.h: No such file
or directory
#include <bits/libc-header-start.h>
^~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.

现在,要安装 gcc 的标准库,我们必须编写以下命令。

sudo apt-get install gcc-multilib
sudo apt-get install g++-multilib

现在,通过使用此代码,我们将看到在 32 位系统和 64 位系统中执行的差异。

示例

#include<stdio.h>
main() {
   printf("The Size is: %lu\n", sizeof(long));
}

输出

$ gcc test_c.c
test_c.c:3:1: warning: return type defaults to ‘int’ [-Wimplicit-int] main(){
^~~~
$ ./a.out
The Size is: 8

输出

$ gcc -m32 test_c.c
test_c.c:3:1: warning: return type defaults to ‘int’ [-Wimplicit-int]
main(){
^~~~
test_c.c: In function ‘main’:
test_c.c:4:28: warning: format ‘%lu’ expects argument of type ‘long unsigned
int’, but argument 2 has type ‘unsigned int’ [-Wformat=]
printf("The Size is: %lu\n", sizeof(long));
~~^
%u
$ ./a.out
The Size is: 4

更新日期:30-Jul-2019

1K+ 人浏览

开始你的 职业

通过完成该课程获得认证

开始
广告