我正在使用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位目录文件(它们没有问题),但我不能弄清楚如何解决它。
答案 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机器。看看它是否有效。它对我有用。