因為最新的Qt5.7需要C++11的編譯器,,而手上有的編譯器最高版本為arm-linux-gcc-4.5.1,不支持c++11,只能自己動手編譯了,。 網(wǎng)上說的很多都是自舉編譯,,就是一開始只有一個x86版本的gcc,,然后要編譯出一個arm-linux-gcc來,。必須分成兩步走,,首先編譯一個不支持glibc的arm-linux-gcc,,這個不支持動態(tài)庫,可以用來編譯uboot和kernel的不支持動態(tài)鏈接的程序,,剛好可以用來編譯glibc,。因為glibc是linux系統(tǒng)最底層的支持庫,所以都是靜態(tài)編譯的,,或者說它不會調(diào)用其他層次的動態(tài)庫,,因為它自己就是最底層的了。編譯后glibc后就可以編譯最終版本的gcc了,,這時候gcc在被編譯時會和剛才編譯出來的glibc進行對接,,需要調(diào)用系統(tǒng)或glibc函數(shù)時直接從剛才編譯出的glibc庫文件中調(diào)取就行了。 因為自己手上已經(jīng)有了現(xiàn)成的arm-linux-gcc-4.5.1和glibc庫可用,所以就可以跳過自舉編譯的那一步,,直接用arm-linux-gcc-4.5.1進行編譯,,一步到位,。相關(guān)腳本如下 首先編譯一個binutils: /opt/ct-ng-build/.build/src/binutils-2.25.1/configure --prefix=/usr/local/cross-tools/tools/ --with-sysroot=/opt/tinyroot --target=arm-hes-linux-gnueabi make -j8 make install 然后是編譯gcc: export CC_FOR_TARGET=arm-linux-gcc export GCC_FOR_TARGET=arm-linux-gcc export CXX_FOR_TARGET=arm-linux-g++ export BINUTILS_PATH=/usr/local/cross-tools/tools export AR_FOR_TARGET=${BINUTILS_PATH}/bin/arm-hes-linux-gnueabi-ar export LD_FOR_TARGET=${BINUTILS_PATH}/bin/arm-hes-linux-gnueabi-ld export OBJDUMP_FOR_TARGET=${BINUTILS_PATH}/bin/arm-hes-linux-gnueabi-objdump export NM_FOR_TARGET=${BINUTILS_PATH}/bin/arm-hes-linux-gnueabi-nm export RANLIB_FOR_TARGET=${BINUTILS_PATH}/bin/arm-hes-linux-gnueabi-ranlib export READELF_FOR_TARGET=${BINUTILS_PATH}/bin/arm-hes-linux-gnueabi-readelf export STRIP_FOR_TARGET=${BINUTILS_PATH}/bin/arm-hes-linux-gnueabi-strip export AS_FOR_TARGET=${BINUTILS_PATH}/bin/arm-hes-linux-gnueabi-as export OBJCOPY_FOR_TARGET=${BINUTILS_PATH}/bin/arm-hes-linux-gnueabi-objcopy /opt/gcc-5.2.0/configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-hes-linux-gnueabi --prefix=/usr/local/cross-tools/ --with-arch=armv6 --with-tune=arm1176jzf-s --with-fpu=vfp --with-float=softfp --enable-languages=c,c++ --disable-multilib --enable-threads=posix --with-sysroot=/opt/tinyroot --disable-nls --enable-symvers=gnu --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --enable-target-optspace --disable-libstdcxx-pch --enable-plugins --enable-linker-build-id --enable-long-long --with-linker-hash-style=both --enable-plugin --enable-gold --enable-lto --enable-__cxa_atexit --disable-libmudflap --disable-libgomp --disable-libssp --disable-libquadmath --disable-libquadmath-support --disable-libsanitizer --program-suffix=5.2.0 --with-gmp=/usr/local --with-mpfr=/usr/local --with-mpc=/usr/local --with-isl==/usr/local --disable-decimal-float --disable-checking --with-build-time-tools=/usr/local/cross-tools/tools >log make -j8 >>log 很關(guān)鍵的一點必須注意: binutils配置中的--target必須和gcc配置中的--target一致,不然會出錯,,提示/usr/local/cross-tools/tools//bin/arm-linux-ld: 未知的仿真模式: armelf_linux_eabi 支持的仿真: armelf_linux armelf armelfb armelfb_linux 一開始binutils 配置的--target=arm-linux,,可是gcc配置偏偏不支持--target=arm-linux, 最后配置為--target=arm-linux-gnueabi,可是又出現(xiàn)了上面的錯誤提示,查了很多資料都沒解決,。 忽然靈光一閃,,ld是在binutils中編譯的,會不會是binutils和gcc配置目標不一致導(dǎo)致出問題呢,?,! 修改binutils配置如上面腳本所示后重新編譯,再編譯gcc,,一步成功?。?!問題果然如此?。?br>還有一個必須要注意的是binutils和gcc配置中的--with-sysroot必須保持一直,,不然會出問題,!因為兩個是互相配置工作的,一個編譯,,一個鏈接,,必須有默契才行。binutils中的as和ld必須按照gcc文檔放到固定目錄下或者在配置參數(shù)中指定,,不然可能出錯,。一開始我沒按照說明來做,結(jié)果交叉編譯時gcc調(diào)用了系統(tǒng)本身的x86版本的as和ld,。 |
|
來自: guitarhua > 《工作總結(jié)》