看我linux(ubuntu)下的64位编译器编译32位程序

本文介绍了在Ubuntu 64位系统上如何查看系统位数,并详细讲解了如何配置系统以支持32位程序的编译。在尝试编译32位程序时,如果没有正确配置,会遇到错误。通过开启多架构支持并安装必要的库,可以成功编译并在32位和64位环境下运行程序。

大家看到这个不要好奇,我也是在分析结构体大小时想到的,

我们大家都知道在windows底下,我们想编译一个c程序(用64位和32位分别编译,特别不方便),除非是双系统,或者虚拟机,但是装这些有时候挺麻烦的,

但是但是,在linux底下这可是很方便的,

我们来看:



一    .查看当前linux系统到底是多少位!!!

      方法1:

getconf  LONG_BIT

  我们在linux终端下敲入这个命令:出现32(那么就是32位系统),出现64(那么就是64位系统)

大家看运行结果:


方法二:

file   /sbin/int
同样我们在linux终端下敲入这个命令:

大家来看运行结果:



方法三:

我觉得这是最简单的东西了:也好记:

uname  -a

运行结果:




方法四:

dpkg --print-architecture
运行结果:


上面的一切都说明我的系统是64位:

好,接下来我们需要做的就是配置,让它也可以进行32位的编译


(插曲)

在安装 Ubuntu 的时候建立的帐户 sai,想把密码改成两个字母aa,方便输入。

运行终端

sai@xmomx:~$ passwd sai
更改 sai 的密码。
(当前)UNIX 密码: xx
输入新的 UNIX 密码: aa
重新输入新的 UNIX 密码:aa
必须选择更长的密码
输入新的 UNIX 密码: 1234567
重新输入新的 UNIX 密码: 1234567
Bad: new password is too simple
输入新的 UNIX 密码:

 

绿色为手动输入。怎么办?加上su权限执行即可。这样来做:

方案一:

sai@xmomx:~$ sudo passwdsai
[sudo] password for sai: xxx
输入新的 UNIX 密码: aa
重新输入新的 UNIX 密码: aa
passwd:已成功更新密码



假如我们并没有配置,就直接用 的话,会报错

程序1:

#include <stdio.h>                                                             

struct stu{

        char a;
        double b;
        char c;
};

int main(){

        struct stu ss;
        printf("%d\n", sizeof(ss));
        return 0;
}

我们先看一下,在64位下运行的结果:

然后我们再看一下,在32位下运行的结果(我们直接用,也就是说是还没有配置,如:gcc  test.c   -m32),回报错:


好,接下来,到啦我们该配置的时候来:



步骤二(配置多构架内核,也就是同时支持64,32位)

(1),确认打开多构架

dpkg --print-foreign-architectures

出现结果:i386,则为已经打开

(2),打开多构架支持功能


sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get dist-upgrade

依次执行上面的命令

另外第三个命令执行时间有点长,(哈哈,够大家去吃个饭,冲个coffee了,大家耐心等待吧!!!)

当我们敲完上面的命令时就说明,已经支持一部分了,但是现在,我们的程序还不能完全运行

接着我们还要输入如下命令:

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

这时我们的编译器已经完美了,也就是说用这个命令(gcc test.c -m32)

大家可以看一下我们程序运行的结果:



好了,0k,我们的编译器完成了我们的目标了。


但是,但是,大家注意到了吗?,对于linux,64,32位,它们分配内存情况并不一样(同样的结构体),我们可以看到

对于上面的程序

32位:        结构体大小位16

64位:        结构体大小位24


至于为什么??大家可以看这个链接:http://blog.youkuaiyun.com/msdnwolaile/article/details/50158463点击打开链接

从内存的角度分析了编译器分配的过程




(ps:上面配置32位的过程,借鉴与:http://www.cnblogs.com/mliudong/p/4086797.html,

点击打开链接      谢谢你啊!!)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值