64位Linux上编译32位软件

问题:我的软件是运行在32位环境下的,原来也是在CentOS 6.3 32位上编译,运行都是没有问题的;

最近CentOS 7出来了,但是只有x86_64的,我的任务就是将我的软件移植到64位的CentOS 7上,能够编译成功,且能够运行。

64位系统是兼容32位软件的,所以只要能够编译成功,那么运行将不是问题。


如果只是想编译个hello world,这个任务很简单,下载glibc.i686,glibc-devel.i686,libgcc.i686,

gcc -m32 a.c,就搞定了。但是我的软件非常庞大,依赖于很多第三方的库,有的是rpm包,有的是源码包,所以编译的过程中遇到了很多问题。


第一步:准备环境

安装兼容库和开发工具

如果"Compatibility Libraries"和"Development Tools"没有安装,就先装上

yum grouplist 命令会列出所有安装的和没有安装的可用的安装包。

yum groupinstall "Compatibility Libraries"

yum groupinstall "Development Tools"


然后安装32位glibc、libgcc库:

yum install glibc.i686 glibc-devel.i686 libgcc.i686


把上面的安装好后,先写个hello world试一下:

gcc -m32 a.c

如果编译、运行都没有问题,就可以编译我的软件了。


第二步:编译

运行顶层的build脚本时需要改成

setarch i386 --uname-2.6 ./build.sh

将平台设置成i386,并将内核版本设置成2.6。

这么做是因为大多数开源的源码包会根据平台来设置编译选项,设置成i386才有可能编译32的程序;

有些开源软件可能还不支持大于3.0的内核,所以内核版本也得修改。如果都支持的话,这个就没有必要修改啦。


然后开始编译,编译时遇到很多问题,如下。

问题1:编译mutt开源软件时,出错:

checking for waddnwstr in -lncurses... no
checking for waddnwstr in -lncursesw... no
checking for initscr in -lncurses... no
checking for initscr... (cached) no
checking for tgoto... no
checking for tgoto in -ltermcap... no
checking for tgoto in -ltermlib... no
checking for tgoto in -lunknown... no
checking for initscr in -lcursesX... no
checking for initscr in -lcurses... no
checking for initscr in -lncurses... (cached) no
checking for initscr in -lxcurses... no
checking for initscr in -ljcurses... no
checking for initscr in -lunknown... no
configure: error: no curses library found
configure: error: ./configure failed for misc/mutt
make: *** [App] Error 255

显示找不到curses库,那就下载

yum install ncurses-devel.i686 ncurses-libs.i686

下载后问题还是存在,但是库文件明明已经存在,查看mutt目录下的config.log文件,发现编译测试程序时,编译选项只有-O2,没有-m32

在configure中所有的:

ac_link='$CC -o conftest$ac_exeext …

加上-m32

ac_link='$CC -m32 -oconftest$ac_exeext …

这是AC_CHECK_LIB的问题,编译测试程序时没有加-m32选项,链接64位的库找不到。







  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux系统中,32位(32-bit)和64位(64-bit)是两种常见的架构。32位Linux通常指的是操作系统、库和应用程序支持32位处理器的架构,这些系统可以运行在早期或一些性能较低的硬件上。32位软件源是指提供专为32位CPU设计的软件和更新的存储库。 32位Linux软件源的主要特点括: 1. **兼容性**:这些源码库含了针对32位硬件优化的软件,如Glibc(标准C库)、内核模块和其他开源组件。 2. **资源占用**:由于32位系统处理数据的方式,它们在内存使用和性能上可能不如64位版本高效,尤其是对于大内存任务和高性能计算。 3. **软件选择**:32位Linux可能无法访问到所有最新的64位软件,特别是在图形驱动、多线程应用和大型数据库等领域。 4. **硬件支持**:随着硬件的发展,许多现代的32位兼容硬件可能不再得到厂商的持续支持,导致驱动和硬件更新有限。 **如何找到32位Linux软件源**: - **官方发行版**:比如Ubuntu的32位版本(LTS或主流版),会有一个对应的软件仓库,称为“i386”或“32-bit”。 - **第三方源**:像Arch Linux32位管理器 Pacman 或者 Gentoo 的 Portage 也会有32位可用。 - **手动构建**:对于一些开源项目,如果源代码提供,可以自己编译32位版本。 - **遗产库**:有些软件虽然不再活跃,但可能可以从特定的历史版本中找到32位支持。 **相关问题**: 1. 为什么某些软件不提供32位版本? 2. 如何在Ubuntu等主流系统上切换到32位软件源? 3. 32位软件在现代Linux系统中的生命周期是多久?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值