首先要做一做前期的准備:
一、更新一下軟件源代碼:
sudo su #些時要輸入用戶的密碼
#apt-get update
#apt-get upgrade
接下來要安裝一些軟件包,以滿足編譯的關聯:
#apt-get install g++
#apt-get install gawk
#apt-get install m4
#apt-get install bison
#apt-get install gcc-multilib
-----------也可以使用下面的命令來安裝上面的軟件包:
#apt-get install g++ gawk m4 bison gcc-multilib
--------------
二、准備要編譯的源代碼。
1、gcc-4.7源代碼 (下載地址是:http://gcc.gnu.org/mirrors.html)
2、准備gcc-4.7的三個關聯庫 mpc,mpfr,gmp
2.1版本號分別是;gmp-5.0.4.tar.bz2,mpc-0.9.tar.bz2,mpfr-3.1.0.tar.bz2
2.2關聯庫的下載地址分別是:
http://www.multiprecision.org/index.php?prog=mpc&page=download ####這個是mpc的下載地址
http://www.mpfr.org/mpfr-current/ #####這個是mpfr的下載地址
http://gmplib.org/ #這個是gmp的下載地址
3、所下載得到的源代碼文件放置在同一個目錄中(我的是/home/sn/GCC_4.7-SRC)
三、編譯源代碼生成可執行的二進制文件
1、首先要編譯的是三個關聯的三個庫
首先要做的就是得到root權限:
sudo su #接着輸入你的用戶密碼
下面是解壓文件:
cd /home/sn/GCC_4.7-SRC #進入放置源代碼的壓縮文件的目錄
下面是解壓各個壓縮包:
tar -xjf gmp-5.0.4.tar.bz2
tar -xjf mpc-0.9.tar.bz2
tar -xjf mpfr-3.1.0.tar.bz2
tar -xjf gcc-4.7.tar.bz2
2、編譯源代碼
2.1編譯這個gmp
mkdir /opt/GCC_4.7 #
cd gmp*
mkdir build
cd build
../configure --prefix=/opt/GCC_4.7 --build=i386-linux-gnu
make
make install
2.2編譯mpfr
cd http://www.cnblogs.com/mpfr*
mkdir build
cd build
../configure --pefix=/opt/GCC_4.7 --build=i386-linux-gnu --wiht-gmp=/opt/GCC_4.7
make
make install
2.3編譯這個mpc
cd http://www.cnblogs.com/mpc*
mkdir build
cd build
../ocnfigure --prefix=/opt/GCC_4.7 --build=i386-linux-gnu --with-gmp=/opt/GCC_4.7 --with-mpfr=/opt/GCC_4.7
make
make install
2.4下面是編譯gcc 4.7
cd http://www.cnblogs.com/
mkdir build
在配置之前先講解一下,要用到的配置是什么意思:
--target= 生成的目標系統 #在編譯主機用的不需要配置這個
--build= 編譯的機器的類型 #這個可以說是必須要修改的
--host= 主機的類型 #這個參數不需要用到
--prefix= 安裝的目錄 #這個一定要配置
--enable-languages= 這個是配置生成的程序,支持什么語言的編譯器 #這個要配置,防止生成的文件成多。參數過多造成編譯不通過
--disable-werror 這個是關閉提醒 #不一定需要。
--enable-ld=[yes,no] 這個是聯合binutils編譯的時候用到的。 #如果只編譯這個GCC.這個可以省略
--enable-gold=[yes,no] 這個是聯合binutils編譯的時候用到的。 #只編譯GCC 不需要用到這個。
--program-suffix= 這個是程序的后序 #為了區別與系統自帶的gcc建議加上這個
--program-transform-name= 這個是用來生成個性化的 gcc 命名規則。#如果使用了這個,可以不用上面的--program-suffix 這個選項
--disable-multilib 關閉使用跨平台的庫 #建設使用這個選項
-------------
下面就開始編譯gcc 4.7.0
export LIBRARY_PATH=/usr/lib/i386-linux-gnu #每執行一次export都要按運行(enter)
05 export C_INCLUDE_PATH=/usr/include/i386-linux-gnu
06 export CPLUS_INCLUDE_PATH=/usr/include/i386-linux-gnu
cd build
../gcc-4.7.0/configure --build=i386-linux-gnu --with-gmp=/opt/GCC_4.7 \
--with-mpc=/opt/GCC_4.7 --with-mpfr=/opt/GCC_4.7 --enable-languages=c,c++ \
--disable-multilib --program-transform-name='s&^&sn-linux-x86-& --enable-checking=release \
--enable-ld=yes --enable-gold=yes --prefix=/opt/GCC_4.7
make
make install
#在編譯的配置參數當中我加入了:--wiht-ld=yes,--with-gold=yes
目的是用於編譯后面的binutils 2.22
四、配置生成的gcc
因為在前面的配置中加入了:--program-transform-name='s&^&sn-linux-x86-&
所以我生成的gcc是:
sn-lnux-x86-gcc
g++:sn-linux-x86-g++
因為我學的是C語言,所以我做的主要測試是GCC
1.把sn-linux-x86-gcc加入到環境變量中:
修改的系統配置文件是:/etc/profile
加入以下的參數:
export PATH=$PATH:/opt/GCC_4.7/bin
sudo gedit /etc/profile #打開這個profile文件
加入 export PATH=$PATH:/opt/GCC_4.7/bin 到文件的最后一行去。
保存修改。
再用下面的命令使修改生效:
source /etc/profile
-----------------------
1.1檢查一下,gcc 4.7搜查共享庫和靜態庫的目錄
sn-linux-x86-gcc -print-search-dirs
在顯示的內容中有一個是:
######庫:/lib/i386-linux-gnu/4.7.0:.........
這個是第一個搜索的目錄:
所以要做的就是把這個/usr/lib/i386-linux-gnu目錄的內容連接到這個/lib/i386-linux-gnu/4.7.0。
sudo ln -s /usr/lib/i386-linux-gnu /lib/i386-linux-gnu/4.7.0
-----------------------
2.正式測試生成的gcc 4.7
cd /home/sn #回到主目錄去
touch makefile #生成一個makefile
touch hello.c #生成一個hello.c文件
makefile與hello.c的內容分別如下:
/*hello.c */
#include <stdio.h>
int main()
{
printf("hello GCC_4.7\n");
return 0;
}
---------makefile---------#在這個makefile中,‘#’做為注釋用的。
#makefile for test gcc 4.7
#create by sn
CCOMPILER=sn-linux-x86-
CC = $(CCOMPILE)gcc
#LD = $(CCOMPILER)ld #由於沒有用生成的gcc 4.7來編譯這個binutils 2.22所以這個選項行先不用管
CFLAGS = -g -O2
EXEC = hello
OBJ = $(EXEC).o
SRC = $(EXEC).c
.PHONY:all clean
all:hello
$(EXEC):$(OBJ)
$(CC) $(CFLAGS) -o $@ $< #此行的開始處,是一個[TAB]鍵
$(OBJ):$(SRC)
$(CC) $(CFLAGS) -c $< #此行的開始處,是一個[TAB]鍵
clean:
$(RM) $(EXEC) $(OBJ) #此行的開始處,是一個[TAB]鍵
-----------------------------end of makefile----------------
把上面的內容保存為文件。
在終端輸入make #當沒有錯誤提示的時候就成功了。
輸出的結果應該是:
sn-linux-x86-gcc -g -O2 -o hello hello.c
sn-linux-x86-gcc -g -O2 -c hello.c
------
./hello #運行剛剛編譯好的hello
#hello GCC_4.7
------------
五、用生成的gcc 4.7編譯binutils 2.22,
作用是生成的ld 將會與gcc 4.7相連接,從而可以代表機器上的ld
這個binutils 2.22
可以到以下的網頁下載:
ftp://ftp.gnu.org/gnu/binutils/
下載得到的文件是binutils-2.22.tar.bz2
把這個文件從下載目錄復制到/home/sn/GCC-4.7-SRC目錄中去
cd /home/sn/GCC_4.7-SRC #進入源代碼目錄
tar -xjf binutils-2.22.tar.bz2 #解壓
cd binutils* #進入binutils源代碼的目錄
mkdir build
cd build
../configure --build=i386-linux-gnu --prefix=/opt/GCC_4.7 --enable-ld=yes --enable-gold=yes \
--with-gmp=/opt/GCC_4.7 --wiht-mpfr=/opt/GCC_4.7 --wiht-mpc=/opt/GCC_4.7 \
disable-werror CC=sn-linux-x86-gcc CXX=sn-linux-x86-g++ \
--program-transform=name='s&^&sn-linux-x86-&'
make
make install
--------------------
編譯這個binutils 2.22大概需要10分鍾左右。或者二三分鍾就行了。
在make install 后
會在/opt/GCC_4.7/bin目錄下面生成
as,ld,strip,string等匯編程序
前序是
sn-linux-x86-
下面就來重寫剛剛的makefile
---------makefile---------#在這個makefile中,‘#’做為注釋用的。
#makefile for test gcc 4.7
#create by sn
CCOMPILER=sn-linux-x86-
CC = $(CCOMPILE)gcc
LD = $(CCOMPILER)ld #這個選項現在可以使用了。
CFLAGS = -g -O2
EXEC = hello
OBJ = $(EXEC).o
SRC = $(EXEC).c
.PHONY:all clean
all:hello
$(EXEC):$(OBJ)
$(CC) $(CFLAGS) -o $@ $< #此行的開始處,是一個[TAB]鍵
$(OBJ):$(SRC)
$(CC) $(CFLAGS) -c $< #此行的開始處,是一個[TAB]鍵
clean:
$(RM) $(EXEC) $(OBJ) #此行的開始處,是一個[TAB]鍵
-----------------------------end of makefile----------------
編譯完成后
clear #清屏一下。
cd /home/sn #再次回到主目錄
make clean #清理一下剛剛編譯生成的hello 和hello.o
make #這次使用的是真正意義上的ld 2.22了
----------------教程到此結束了。------------------
本次教程是基於ubuntu 12.04 32 bit
