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