如何使用autotools在64位平台上创建32位共享库

时间:2011-03-21 20:35:05

标签: shared-libraries autotools

我正在使用autotools来构建我的系统,该系统主要由一个库组成。在64位Red Hat平台上,我需要能够生成一个能够在32位Red Hat平台上运行的库。

当我将-m32添加到编译行时,一切都可以正常生成静态(.a)库,但是一旦我尝试创建共享库,我就会得到如下错误:

/usr/bin/ld: warning: i386:x86-64 architecture of input file `/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crti.o' is incompatible with i386 output
/usr/bin/ld: warning: i386:x86-64 architecture of input file `/usr/lib/gcc/x86_64-redhat-linux/4.1.2/crtbeginS.o' is incompatible with i386 output  
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/crtbeginS.o: In function `__do_global_dtors_aux':  
crtstuff.c:(.text+0x29): undefined reference to `__DTOR_END__'  
collect2: ld returned 1 exit status' 

我可以看到问题是它包含/ usr / lib64中的64位目标文件,而不是/ usr / lib中的正确32位目录文件(它们没有问题),但我不能弄清楚如何解决它。

6 个答案:

答案 0 :(得分:14)

首先,确保您具有32位编译的编译器/ libc支持。在像Ubuntu这样的发行版中,您需要做的是安装包gcc-multilib和/或g++-multilib

sudo apt-get install gcc-multilib g++-multilib

然后,在调用configure时,指定一个32位主机并传递32位编译标志:

./configure --host=i686-linux-gnu "CFLAGS=-m32" "CXXFLAGS=-m32" "LDFLAGS=-m32"

如果您没有安装multilib,则在传递configure: error: C compiler cannot create executables标记时会出现-m32之类的错误。

答案 1 :(得分:3)

我在RHEL6上遇到了这个问题。这工作

./configure --host=i386-redhat-linux --build=i386-redhat-linux "CFLAGS=-m32" "CXXFLAGS=-m32" "LDFLAGS=-m32" "LTCC=gcc -m32"

LTCC=gcc -m32是让libtool构建32位库所需的神奇咒语

答案 2 :(得分:1)

我遇到了同样的问题。但我不使用autotools。然后,在手工编辑的Makefile中,我注意到了行

$(CC) -shared -Wl,-soname,lib$(NAME).so.0 -o lib$(NAME).so.$(VERSION) $(OBJ)

没有选择gcc表示32位建筑物。一旦我的CFLAGS已经选择了-m32,我决定把它放在上面提到的那一行:

$(CC) $(CFLAGS) -shared -Wl,-soname,lib$(NAME).so.0 -o lib$(NAME).so.$(VERSION) $(OBJ)
瞧,瞧。它有效!

因此,在autotools中,设置CFLAGS变量以包含-m32选项也适用于你。

希望我帮助过......

答案 3 :(得分:0)

你会尝试:

CFLAGS=-m32 -Wl,-m32
CXXFLAGS=-m32 -Wl,-m32
LDFLAGS=-m32
你的makefile中是否有

,因为有些脚本会尝试使用gcc或g ++而不是ld进行链接?

更新:如果你手动修改每个gcc / g ++调用,只需尝试使用-m32 -Wl,-m32而不是simple -m32作为附加选项。

答案 4 :(得分:0)

在64位计算机上构建32位共享对象的GNU链接器标志是:-m elf_i386 所以请例如在Makefile中写:

LDFLAGS=-m elf_i386

答案 5 :(得分:0)

快速解决....

使用32位linux在另一台PC上构建应用程序并传输结果 应用程序文件(库等)到所需的64位linux机器。看看它是否有效。它对我有用。

相关问题