在x86_64平台上的gcc i686

在RHEL X86_64上安装GCC i686有一些麻烦。 的确,我必须在这个平台上构build一些32位软件和共享库。 我可以在32位平台(linux或windows)上构build这些软件和库。

我的问题在这篇文章的末尾。

我的第一个问题是这个错误:(在一个build筑,在日食 – 天鹅)

In file included from /usr/include/stdlib.h:314, from ../../../../../XXXX.h:19, from /XXXX.c:33: /usr/include/sys/types.h:150: error: duplicate 'unsigned' /usr/include/sys/types.h:151: error: duplicate 'unsigned' /usr/include/sys/types.h:151: error: duplicate 'short' /usr/include/sys/types.h:152: error: duplicate 'unsigned' /usr/include/sys/types.h:152: error: two or more data types in declaration specifiers make: *** [XXXX.o] Error 1 

为了纠正这个错误,我不得不把stdlib.h包括在所有其他文件之前,但是我有很多的文件,有时这个技巧不pipe用。 而且,我不应该修改源文件。

当我使用朋友提供的makefile来构build共享库时,我也遇到了同样的问题。 这个makefile在他的平台上工作得很好(和我一样,RHEL 4.4.6 x86_64)。

他告诉我这个错误是因为我使用X86_64 lib来build立一个32位软件(或共享库)。

这是我的GCC版本:

 GCC version [root@localhost bin]# gcc -v Target: x86_64-redhat-linux Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre --enable-libgcj-multifile --enable-java-maintainer-mode --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --disable-libjava-multilib --with-ppl --with-cloog --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux thread: posix gcc version 4.4.6 20110731 (Red Hat 4.4.6-3) (GCC) [root@localhost bin]# rpm -qa |grep gcc gcc-c++-4.4.6-3.el6.x86_64 gcc-4.4.6-3.el6.x86_64 gcc-gfortran-4.4.6-3.el6.x86_64 

所以首先,我安装了RHEL DVD设置中的glibc.i686和libgcc.i686软件包。 我现在有:

 Installed packages (from redhat DVD) [root@localhost bin]# rpm -qa |grep glibc glibc-common-2.12-1.47.el6.x86_64 glibc-2.12-1.47.el6.x86_64 glibc-devel-2.12-1.47.el6.x86_64 glibc-devel-2.12-1.47.el6.i686 glibc-headers-2.12-1.47.el6.x86_64 glibc-2.12-1.47.el6.i686 [root@localhost bin]# rpm -qa |grep libgcc libgcc-4.4.6-3.el6.x86_64 libgcc-4.4.6-3.el6.i686 

由于GCC是x86_64,我读了一些关于交叉编译的文档,特别是这个: wiki.osdev.org/GCC_Criss-Compiler

于是我下载了:gcc-4.4.6.tar.gz,binutils-2.23.tar.gz,gmp-5.0.2.tar.gz和mpfr-3.1.1.tar.gz。 我把目录gmp-5.0.2和mpfr-3.1.1放在gcc-4.4.6目录下(我将gmp-5.0.2改名为gmp,而mpfr-3.1.1改名为mpfr)。

我遵循了wiki.osdev的说明,即:

 export PREFIX=/usr/local/cross export TARGET=i686-elf cd /usr/src mkdir build-binutils build-gcc cd /usr/src/build-binutils ../binutils-x.xx/configure --target=$TARGET --prefix=$PREFIX --disable-nls make all make install cd /usr/src/build-gcc export PATH=$PATH:$PREFIX/bin ../gcc-xxx/configure --target=$TARGET --prefix=$PREFIX --disable-nls \ --enable-languages=c,c++ --without-headers make all-gcc make install-gcc 
  • ' make all '和' make install'binutils =>确定
  • ' make all-gcc '

– >第一个错误:缺less“real.h”中的“mpfr.h”。 所以我在gcc-4.4.6 / gcc中添加了mpfr.h,并且没问题(实际上可能不是…)

– >第二个错误(现在唯一一个):

 [...] gcc -g -O2 -DIN_GCC -DCROSS_DIRECTORY_STRUCTURE -W -Wall -Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes -Wcast-qual -Wold-style-definition -Wc++-compat -Wmissing-format-attribute -pedantic -Wno-long-long -Wno-variadic-macros -Wno-overlength-strings -DHAVE_CONFIG_H -o cc1-dummy c-lang.o stub-objc.o attribs.o c-errors.o c-lex.o c-pragma.o c-decl.o c-typeck.o c-convert.o c-aux-info.o c-common.o c-opts.o c-format.o c-semantics.o c-ppoutput.o c-cppbuiltin.o c-objc-common.o c-dump.o c-pch.o c-parser.o i386-co c-gimplify.o tree-mudflap.o c-pretty-print.o c-omp.o dummy-checksum.o \ main.o libbackend.a ../libcpp/libcpp.a ../libdecnumber/libdecnumber.a ../libcpp/libcpp.a ../libiberty/libiberty.a ../libdecnumber/libdecnumber.a -L/usr/src/build-gcc/./gmp/.libs -L/usr/src/build-gcc/./gmp/_libs -L/usr/src/build-gcc/./mpfr/.libs -L/usr/src/build-gcc/./mpfr/_libs -lmpfr -lgmp **/usr/bin/ld: cannot find -lmpfr collect2: ld returned 1 exit status make[1]: *** [cc1-dummy] Error 1 make[1]: Leaving directory `/usr/src/build-gcc/gcc' make: *** [all-gcc] Error 2** 

**最后,我的问题是:

  • 这个交叉编译能解决我的问题吗?

  • 解决ld mpfr丢失问题的好方法是什么?

在发布之前,我做了大量的研究。 我的linux知识在这个时候不是很好。

预先感谢您的帮助。


编辑#1:

我已经尝试了-m32标志,但问题仍然存在。

例如,如果我运行一个makefile:

 [root@localhost makefile]# make -f sharedLib.mak gcc -m32 -march=i686 -O2 -Wall -I ../../sharedLib/inc/ -o XXX.o -c ../src/XXX.c In file included from /usr/include/stdlib.h:314, from ../src/XXX.c:51: /usr/include/sys/types.h:150: error: duplicate 'unsigned' /usr/include/sys/types.h:151: error: duplicate 'unsigned' /usr/include/sys/types.h:151: error: duplicate 'short' /usr/include/sys/types.h:152: error: duplicate 'unsigned' /usr/include/sys/types.h:152: error: two or more data types in declaration specifiers make: *** [XXX.o] Error 1 

这里是XXX.c:

 #include "alphabet.h" #include "outils.h" #include "erreur.h" #include <string.h> #include <stdlib.h> (line 51 error) 

如果以这种方式修改:

 #include <stdlib.h> #include "alphabet.h" #include "outils.h" #include "erreur.h" #include <string.h> 

一切正常的XXX.c但错误出现的下一个源文件…

不需要编译一个32位版本的GCC; 只需提供-m32标志来生成64位版本的GCC( FAQ条目 )的32位代码。

这个问题支持: 如何在x86_64机器上编译glibc 32位

请注意,您可能需要安装32位版本和devel所有您要编译的代码的依赖关系的包(即linux头文件,glibc,…)

编辑要调试这样的问题,看到GCC试图编译的源代码通常是有用的。 为此,请使用gcc -E而不是gcc -c 。 这会给你预处理的C源代码以及很多#line语句,它们告诉GCC正在读什么文件来产生下面的内容。

创建这样一个文件,并检查它。 上面的错误让我怀疑你是否创建了一个预处理器宏,它扩展到stdlib.h某些意外事件。