在64位Linux机器上静态编译32位程序

时间:2013-06-17 16:58:17

标签: linux compiler-errors static-libraries

我使用configure, make, make install安装libevent库。 我的电脑是

[esolve@kitty esolve]$ uname -r
3.6.10-2.fc16.x86_64

我写了一个使用libevent的程序。因为我想将此程序分发给许多未安装libevent的远程主机。所以我想用静态编译程序,使用

gcc -o myprogram mypro.c /usr/local/lib/libevent.a -lpcap -lrt

现在我注意到一些远程机器是32位,而不是64位

所以我想用-m32编译

gcc -m32 -o myprogram mypro.c /usr/local/lib/libevent.a -lpcap -lrt

但我收到了错误:

/usr/bin/ld: i386:x86-64 architecture of input file `/usr/local/lib/libevent.a(event.o)' is incompatible with i386 output
/usr/bin/ld: i386:x86-64 architecture of input file `/usr/local/lib/libevent.a(log.o)' is incompatible with i386 output
/usr/bin/ld: i386:x86-64 architecture of input file `/usr/local/lib/libevent.a(evutil.o)' is incompatible with i386 output
/usr/bin/ld: i386:x86-64 architecture of input file `/usr/local/lib/libevent.a(select.o)' is incompatible with i386 output
/usr/bin/ld: i386:x86-64 architecture of input file `/usr/local/lib/libevent.a(poll.o)' is incompatible with i386 output
/usr/bin/ld: i386:x86-64 architecture of input file `/usr/local/lib/libevent.a(epoll.o)' is incompatible with i386 output
/usr/bin/ld: i386:x86-64 architecture of input file `/usr/local/lib/libevent.a(signal.o)' is incompatible with i386 output
collect2: ld returned 1 exit status

有什么解决方法吗? 谢谢!

1 个答案:

答案 0 :(得分:1)

如果要在32位模式下使用自己的编译库(例如libevent),则应configure使用CC='gcc -m32'将其编译为32位模式。

如果你想同时拥有32&同一个库的64位版本你应该两次构建库,使用不同的configure选项(不要忘记构建之间的make clean),也许更改--prefix或{{1} }

您还可以考虑在--libexec-prefix环境中进行完整的32位分发(然后您需要chroot安装某些目录,例如bind,{{1}等等......)。