在Linux x64环境下gcc编译32位程序及Library

一直都在x64服务器上开发和部署, 偶尔遇到了几台x86服务器, 花了一天的时间去编译出各种x86版本的库, 在网上搜了下大多数回复都很简单, 但是实际上对于一个引用库比较多的程序就麻烦多了, 这里记录下我的过程, 用的是gcc.

  1. 首先, 程序的编译要加-m32选项, 具体怎么加, 加在哪里根据项目自身而定.要注意的是, 不仅CXXFLAGS (or CFLAGS)要加, 最主要的是链接选项也要有,否则g++ –WL 之类的链接命令在没有-m32下会对找到的32位Lib提示:”Skip incompatible file type ….”.

我用的是CMAKE, 因此要在下面的环境变量里加上该选项:

1
2
SET(CMAKE_CXX_FLAGS  "$ENV{CXXFLAGS} -O0 -m32")
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lrt -m32")
  1. 上一步仅仅是设定了自己程序的编译选项, 这么一来, 所有要求引用的库都要求用ELF 32版本, 很简单file命令就可以查看库的版本:
1
2
[root@localhost ~]# file /usr/lib/libboost_system.so.1.55.0
/usr/lib/libboost_system.so.1.55.0: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, not stripped

 

对于C/C++的标准库而言很简单,安装对应的包即可, 我的是CentOS6.x,对应下面:

1
2
yum install glibc-devel.i686
yum install libstdc++-devel.i686

 

对于其它库也可以用相同的方法, 例如下载安装mysql-libs.x86_64对应的mysql-libs.i686即可解决libmysqlclient.so之类的库引用问题.

但是对于不存在于包管理内的第三方库就没那么幸运了, 对于Boost C++ library 和POCO C++ library ,可以分别参照即将发的两篇文章.