2012年6月20日 星期三

編譯gcc可能遇到的一些error


首先編譯前看看一下我原先配置
$gcc -v

使用內建 specs。
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/i686-linux-gnu/4.6/lto-wrapper
目的:i686-linux-gnu
配置為:../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.6.3-1ubuntu5' --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.6 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --enable-objc-gc --enable-targets=all --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=i686-linux-gnu --host=i686-linux-gnu --target=i686-linux-gnu
執行緒模型:posix
gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)

我所要編譯gcc的平台是ubuntu 12.04 32 bit
編譯gcc前請先檢查本身是否已經裝上gcc和binutils否則無法從gcc原碼編譯
還有編譯前要依序安裝gmp > mpfr> mpc
裝gmp前先
$sudo aptitude install build-essential m4
避免錯誤
checking for suitable m4… configure: error: No usable m4 in $PATH or /usr/5bin (see config.log for reasons).
對這三個安裝的配置分別
./configure --prefix=/usr/local/gmp --build=i386-linux-gnu
./configure --prefix=/usr/local/mpfr --build=i386-linux-gnu
./configure --prefix=/usr/local/mpc --with-gmp=/usr/local/gmp --with-mpfr=/usr/local/mpfr --build=i386-linux-gnu
可以先創建一個build資料夾讓編譯完的資料可以放在裡面如($表示終端機#表示說明)
$mkdir build
$cd build #跳到此目錄
$../configure --prefix=/usr/gcc-4.7.1 --with-gmp=/usr/local/gmp --with-mpfr=/usr/local/mpfr --build=i386-linux-gnu #--prefix為安裝的路經資料夾
我是裝到/usr/gcc-4.7.1
$make
$make install

三個都安裝完後接著配置

$export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/gcc-4.7.1/lib #gmp, mpfr, mpc都裝到/usr/gcc-4.7.1/了所以這行有沒有沒差(我自己是沒寫這行有錯請跟我說!)
$export LIBRARY_PATH=/usr/lib/i386-linux-gnu
$export C_INCLUDE_PATH=/usr/include/i386-linux-gnu
$export CPLUS_INCLUDE_PATH=/usr/include/i386-linux-gnu
準備開始編譯gcc了
$mkdir build #在源文件下創建build文件
$cd build
$../configure --build=i386-linux-gnu --target=i386-linux-gnu --prefix=/usr/gcc-4.7.1 --with-gmp=/usr/gcc-4.7.1 --with-mpfr=/usr/gcc-4.7.1 --with-mpc=/usr/gcc-4.7.1 --enable-threads=posix --enable-checking=release --enable--long-long --enable-languages=c,c++,java,objc,obj-c++,fortran --enable-shared --with-system-zlib --enable-__cxa_atexit --enable-clocale=gnu --disable-libunwind-exceptions --enable-libgcj-multifile --enable-java-awt=gtk --disable-dssi --enable-plugin --disable-multilib --with-arch=i686
#這邊是我的配置參數粗體部份不可少接著編譯

以下是我遇到的一些error狀況
1)找不到zlib.h文件或zlib.h:No such file or directory
解決$sudo apt-get install zlib1g-dev
2)error: bits/predefs.h:No such file or directory compilation terminated. ,需要安裝包multilib,
解決$sudo apt-get install gcc-multilib
3)缺少gnu/stubs-32.h:No such file or directory, 需要安裝g++-multilib
http://stackoverflow.com/questions/7412548/gnu-stubs-32-h-no-such-file-or-directory
這邊網路上大多是說sudo apt-get install libc6-dev-i386可以解決可是在ubuntu下找不到此安裝套件
也進行$sudo apt-get install g++-multilib, 編譯還是出錯,找不到答案所以參考網友作法用複製的
解決$cp stubs-32.h /usr/include/i386-linux-gnu/gnu /usr/include/gnu
4)error:libxtst file not found
解決sudo apt-get install libxtst-dev
5)error:Package gtk+-2.0 was not found in the pkg-config search path.
解決sudo aptitude install libgtk2.0-dev
6)編譯出現undefined reference to `__sync_bool_compare_and_swap_4'
你在配置./configure 沒加上--with-arch=i686
因為Glibc不再支援i386
編譯完成安裝後
進行舊編譯器保留與應用新的編譯器
$mv gcc gcc463
$mv g++ g++463
$mv cpp cpp463
$mv c++ c++463
連結到新的編譯器

$ln -s /usr/gcc-4.7.1/bin/gcc /usr/bin/gcc
$ln -s /usr/gcc-4.7.1/bin/g++ /usr/bin/g++
$ln -s /usr/gcc-4.7.1/bin/cpp /usr/bin/cpp
$ln -s /usr/gcc-4.7.1/bin/c++ /usr/bin/c++
最後查看一下目前版本
$gcc -v

使用內建 specs。
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/gcc-4.7.1/libexec/gcc/i386-linux-gnu/4.7.1/lto-wrapper
目的:i386-linux-gnu
配置為:../configure --build=i386-linux-gnu --target=i386-linux-gnu --prefix=/usr/gcc-4.7.1 --with-gmp=/usr/gcc-4.7.1 --with-mpfr=/usr/gcc-4.7.1 --with-mpc=/usr/gcc-4.7.1 --enable-threads=posix --enable-checking=release --enable--long-long --enable-languages=c,c++,java,objc,obj-c++,fortran --enable-shared --with-system-zlib --enable-__cxa_atexit --enable-clocale=gnu --disable-libunwind-exceptions --enable-libgcj-multifile --enable-java-awt=gtk --disable-dssi --enable-plugin --disable-multilib --with-arch=i686
執行緒模型:posix
gcc version 4.7.1 (GCC)

別忘了編譯幾個程式測試這樣完成GCC安裝了!


如果找不到 crt1.o, etc. 可能需要以下處理
ln -s /usr/lib/i386-linux-gnu/crt1.o /lib/crt1.o
ln -s /usr/lib/i386-linux-gnu/crti.o /lib/crti.o
ln -s /usr/lib/i386-linux-gnu/crtn.o /lib/crtn.o