這篇文章主要介紹了詳解在Ubuntu中編譯、安裝gcc4.1.1過程以及遇到問題的解決方法,具有一定借鑒價值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。
在Ubuntu中編譯、安裝 gcc4.1.1 過程以及遇到的問題
首先簡單介紹一下:GCC是GUN工具鏈中的編譯開發工具,它可以把源程序編譯成為可執行文件(gcc編譯C語言程序;g++編譯C++語言程 序;gcj編譯Java語言程序……)。例如:使用gcc由C語言源代碼文件生成可執行文件的過程要經歷四個相互關聯的步驟:預處理(也稱預編譯,Preprocessing)、編譯(Compilation)、匯編(Assembly)和 鏈接(Linking)。
預處理階段:gcc調用預處理程序cpp進行預處理,該階段負責展開宏、插入頭文件等。
編譯階段:gcc調用ccl,把預處理后的文件翻譯成匯編。
匯編階段:gcc調用as,把匯編程序編譯成為目標文件。
鏈接階段:gcc調用連接程序ld,把目標文件和庫文件鏈接一起,形成可執行文件。
其實安裝Linux操作系統后,系統會自帶GCC編譯器。因此安不安裝更高版本的GCC無傷大局,不過了解一下其安裝過程還是有一定的好處的。
1:熟悉Linux下的命令。
2:熟悉Linux下的文件布局及其主要功能。
3:在遇到問題時,考驗一下自身解決問題的能力(其實主要就是上網搜索的能力啦O(∩_∩)O)。
4:當然是課程的需要啦。
說了這么多的前言,現在進入到今天的主題:安裝GCC4.1.1的過程和在安裝過程中所遇到的一些問題及其解決策略。
(我的Ubuntu是 9.10 版本)
第一步:下載
在GCC網站上(http://gcc.gnu.org/) 或者通過網上搜索可以查找到下載資源。目前GCC的最新版本為4.5.0。但我用的是gcc-4.1.1.tar.bz2 網上可供下載的文件一般有兩種形式:gcc-4.1.1.tar.gz和gcc-4.1.1.tar.bz2,只是壓縮格式不一樣,內容完全一致,下載其中一種即可。
第二步:解壓縮
根據壓縮格式,進行解壓(以下的“%”表示命令行提示符):
% tar -xjvf gcc-4.1.1.tar. bz2
新生成的gcc-4.1.1這個目錄被稱為源目錄,用${srcdir}表示它。以后在出現${srcdir}的地方,應該用真實的路徑來替換它。用pwd命令可以查看當前路徑。
在${srcdir}/INSTALL目錄下有詳細的GCC安裝說明,可用瀏覽器打開index.html閱讀。
第三步:建立目標目錄
目標目錄(用${objdir}表示)是用來存放編譯結果的地方。GCC建議編譯后的文件不要放在源目錄${srcdir}中(雖然這樣做也可以),最好單獨存放在另外一個目錄中,而且不能是${srcdir}的子目錄。
例如,可以這樣建立一個叫 gcc4 的目標目錄(與源目錄${srcdir}是同級目錄):
% mkdir gcc4
% cd gcc4
以下的操作主要是在目標目錄 ${objdir} 下進行。
第四步:配置
配置的目的是決定將GCC編譯器安裝到什么地方(${destdir}),支持什么語言以及指定其它一些選項等。其中,${destdir}不能與${objdir}或${srcdir}目錄相同。
${srcdir}下的configure來完成的。其命令格式為(記得用你的真實路徑替換${destdir})??配置是通過執行
% ${srcdir}/configure --prefix=${destdir} [其它選項]
例如,如果想將GCC 4.1.1安裝到/home/ssm/gcc4目錄下,則${destdir}就表示這個路徑。
在我的機器上,我是這樣配置的:
% ../gcc4.1.1/configure --prefix=/home/ssm/gcc4 --enable-threads--disable-checking --enable--long-long --host=i386-Ubuntu-linux--with-system-zlib --enable-languages=c,c++,java
第五步:編譯
% make
這是一個漫長的過程。在我的機器上(P4-1.6),這個過程用了50多分鐘
然而從這里問題就出現了:
編譯了一段時間后出錯,其錯誤信息如下:
WARNING: `makeinfo' is missing on your system. You should only need it if
you modified a `.texi' or `.texinfo' file, or any other file
indirectly affecting the aspect of the manual. The spurious
call might also be the consequence of using a buggy `make' (AIX,
DU, IRIX). You might want to install the `Texinfo' package or
the `GNU make' package. Grab either from any GNU archive site.
make[3]: *** [fastjar.info] 錯誤 1
make[3]:正在離開目錄 `/home/ssm/gcc-obj/fastjar'
make[2]: *** [all] 錯誤 2
make[2]:正在離開目錄 `/home/ssm/gcc-obj/fastjar'
make[1]: *** [all-fastjar] 錯誤 2
make[1]:正在離開目錄 `/home/ssm/gcc-obj'
make: *** [all] 錯誤 2
解讀錯誤與解決方法:
(主要原因是GCC的版本過高)
1:全英文的這部分說的是你的系統中缺少相應版本的makeinfo軟件。
因為gcc4.1以上的版本需要makeinfo的版本為4.2或更高。
所以輸入命令行:
makeinfo --version 想查看makeinfo的版本。結果得到了以下信息:
The program 'makeinfo' is currently not installed. You can install it bytyping:
sudo apt-get install texinfo
按照提示輸入命令,問題得到解決。
2:本機使用的Texinfo是4.11版本,
出現此錯誤的原因也在于configure文件中texinfo對該版本不支持,可以在解壓gcc4.1.1文件夾中的configure文件里找到
以下語句
# For an installed makeinfo, we require it to be from texinfo 4.2 or
# higher, else we use the "missing" dummy.
if ${MAKEINFO} --version \
| egrep 'texinfo[^0-9]*([1-3][0-9]|4\.[2-9]|[5-9])' >/dev/null 2>&1;then
:
else
MAKEINFO="$MISSING makeinfo"
fi
;;
其中4\.[2-9]|[5-9]表示的是支持4.2-4.9之間的幾個版本,所以需要自己添加4\.[1-9][0-9]*,以支持4.11版本。即把'texinfo[^0-9]*([1-3][0-9]|4\.[2-9]|[5-9])'編輯成'texinfo[^0-9]*([1-3][0-9]|4\.[2-9]|4\.[1-9][0-9]*|[5-9])'后保存,編譯通過。
本來以為這樣就可以了,所以將gcc-obj中生成文件刪除后,用以下兩條命令重新編譯。
% ../gcc4.1.1/configure --prefix=/home/ssm/gcc4 --enable-threads--disable-checking --enable--long-long --host=i386-Ubuntu-linux--with-system-zlib --enable-languages=c,c++,java
make
不過依舊有問題
錯誤信息如下:
../../gcc-4.1.1/gcc/java/jcf-io.c:43:18: error: zlib.h: 沒有該文件或目錄
../../gcc-4.1.1/gcc/java/jcf-io.c: In function ‘read_zip_member’:
../../gcc-4.1.1/gcc/java/jcf-io.c:193: error: ‘Z_NO_COMPRESSION’ undeclared(first use in this function)
../../gcc-4.1.1/gcc/java/jcf-io.c:193: error: (Each undeclared identifier isreported only once
../../gcc-4.1.1/gcc/java/jcf-io.c:193: error: for each function it appears in.)
../../gcc-4.1.1/gcc/java/jcf-io.c:206: error: ‘z_stream’ undeclared (first usein this function)
../../gcc-4.1.1/gcc/java/jcf-io.c:206: error: expected ‘;’ before ‘d_stream’
../../gcc-4.1.1/gcc/java/jcf-io.c:207: error: ‘d_stream’ undeclared (first usein this function)
../../gcc-4.1.1/gcc/java/jcf-io.c:207: error: ‘alloc_func’ undeclared (firstuse in this function)
../../gcc-4.1.1/gcc/java/jcf-io.c:207: error: expected ‘;’ before numericconstant
../../gcc-4.1.1/gcc/java/jcf-io.c:208: error: ‘free_func’ undeclared (first usein this function)
../../gcc-4.1.1/gcc/java/jcf-io.c:208: error: expected ‘;’ before numericconstant
../../gcc-4.1.1/gcc/java/jcf-io.c:209: error: ‘voidpf’ undeclared (first use inthis function)
../../gcc-4.1.1/gcc/java/jcf-io.c:209: error: expected ‘;’ before numericconstant
../../gcc-4.1.1/gcc/java/jcf-io.c:225: warning: implicit declaration offunction ‘inflateInit2’
../../gcc-4.1.1/gcc/java/jcf-io.c:225: error: ‘MAX_WBITS’ undeclared (first usein this function)
../../gcc-4.1.1/gcc/java/jcf-io.c:226: warning: implicit declaration offunction ‘inflate’
../../gcc-4.1.1/gcc/java/jcf-io.c:226: error: ‘Z_NO_FLUSH’ undeclared (firstuse in this function)
../../gcc-4.1.1/gcc/java/jcf-io.c:227: warning: implicit declaration offunction ‘inflateEnd’
make[2]: *** [java/jcf-io.o] 錯誤 1
make[2]:正在離開目錄 `/home/ssm/gcc-obj/gcc'
make[1]: *** [all-gcc] 錯誤 2
make[1]:正在離開目錄 `/home/ssm/gcc-obj'
make: *** [all] 錯誤 2
解讀錯誤與解決方法:
(主要問題在于你輸入的命令行當中包含了你的系統中不存在的相應軟件)
注:上面的命令行中有這一部分 --with-system-zlib 我把這部分都刪除了,才解決這個錯誤。
原因很簡單是因為--with-system-zlib,當然要求你先裝裝好 zlib (zlib是一種提供數據壓縮的函數庫--自由軟件),特別是 zlib 的開發包了,一般是zlib-devel,在你系統沒有安裝zlib的前提下,刪除該條即可。
另一種解決辦法就是:你先安裝好zlib,然后再編譯。
sudo apt-get install zlib
但是在我的機器上出現了如下問題:找不到zlib(所以我用上面那個方法解決的問題)
正在讀取軟件包列表... 完成
正在分析軟件包的依賴關系樹
正在讀取狀態信息... 完成
E: 無法找到軟件包 zlib
在修正上面這些錯誤之后進行如下步驟:
第六步:安裝
%make install
至此gcc4.1.1就安裝好啦。
其它設置
GCC 4.1.1的所有文件,包括命令文件(如gcc、g++)、庫文件等都在${destdir}目錄下分別存放,如命令文件放在bin目錄下、庫文件在 lib下、頭文件在include下等。由于命令文件和庫文件所在的目錄還沒有包含在相應的搜索路徑內,所以必須要作適當的設置之后編譯器才能順利地找到并使用它們。
gcc、g++、gcj的設置
要想使用GCC ${destdir}/bin放在環境變量PATH中。我不用這種方式,而是用符號連接的方式實現,這樣做的好處是我仍然可以使用系統上原來的舊版本的GCC編譯器。??4.1.1的gcc等命令,簡單的方法就是把它的路徑
首先,查看原來的gcc所在的路徑:
% which gcc
在我的系統上,上述命令顯示:/usr/bin/gcc。因此,原來的gcc命令在/usr/bin目錄下。我們可以把GCC 4.1.1中的gcc、g++、gcj等命令在/usr/bin目錄下分別做一個符號連接:
% cd /usr/bin
% ln -s ${destdir}/bin/gcc gcc4
% ln -s ${destdir}/bin/g++ g++4
% ln -s ${destdir}/bin/gcj gcj4
(若不是使用root用戶登錄,則需要在命令行前面加 sudo )
這樣,就可以分別使用gcc4、g++4、gcj4來調用GCC 4.1.1的gcc、g++、gcj完成對C、C++、JAVA程序的編譯了。同時,仍然能夠使用舊版本的GCC編譯器中的gcc、g++等命令。
庫路徑的設置
將${destdir}/lib路徑添加到環境變量LD_LIBRARY_PATH中,最好添加到系統的配置文件中,這樣就不必要每次都設置這個環境變量了。
例如,如果GCC 4.1.1安裝在/home/ssm/gcc4目錄下,在Ubuntu Linux下可以直接在命令行上執行或者在文件/etc/profile中添加下面一句:
$LD_LIBRARY_PATH
測試
1:看一下gcc4的版本:
gcc4 -v
如果編譯成功則輸出如下信息:
使用內建 specs。
目標:i386-Ubuntu_linux
目標為:../gcc4.1.1/configure --prefix=/home/ssm/gcc4 --enable-threads--disable-checking --enable--long-long --host=i386-Ubuntu-linux--enable-languages=c,c++,java
線程模型:posix
gcc版本 4.1.1
2:用新的編譯命令(gcc4、g++4等)編譯你以前的C、C++程序,檢驗新安裝的GCC編譯器是否能正常工作。
例如:gcc4 -o hello.c hello
……
根據需要,可以刪除或者保留${srcdir}和${objdir}目錄。
感謝你能夠認真閱讀完這篇文章,希望小編分享詳解在Ubuntu中編譯、安裝gcc4.1.1過程以及遇到問題的解決方法內容對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,遇到問題就找億速云,詳細的解決方法等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。