64位Linux上编译32位软件

来源:互联网 发布:ubuntu 安装 交换分区 编辑:程序博客网 时间:2024/04/30 21:42

问题:我的软件是运行在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位的库找不到。







0 0
原创粉丝点击