64位linux编译32位程序
昨天接到的任务,编译64位和32位两个版本的.so动态库给其他部门,我的ubuntu虚拟机是64位的,编译32位时遇到了问题:
/usr/bin/ld: cannot find -lstdc++
最后在stackoverflow上看到了解决方案(安装multilib,我的源程序既有c又有cpp,所以只好gcc和g++都装了):
sudo apt-get install gcc-multilib
sudo apt-get install g++-multilib
然后再 gcc -I./include *.c *.cpp -m32 -fPIC -shared -o xxxx.so -lstdc++
需要注意的是,若在程序中引用32位库,则该程序也必须编译成32位可执行文件:
g++ -o testso -m32 -fPIC test.c -L -lxxxx -ldl(根据.so情况不同,这里也可以是gcc,注意-fPIC不会出错)
因为我的test.c中调用了刚才生成的动态库 xxxx.so,所以加了-ldl
另,在CentOS下,安装g**multilib就需要不同的命令了,安装的包也跟系统版本有关,可以先运行lsb_release -a查看一下自己的版本,然后运行:
CentOS/RHEL 5.x
yum -y install glibc-devel.i386 libstdc++-devel.i386
CentOS/RHEL 6.x
yum -y install glibc-devel.i686 libstdc++-devel.i686