GCC(GNU Compiler Collection,GNU編譯器合集)是linux以及其他類UNIX平台上進行開源項目,軟體開發等必不可少的工具鍊組成之一。(其他的還有clang以及llvm等編譯器)
對于程式員以及系統管理者而言,經常需要從軟體的源碼進行手動編譯安裝,
不論是configure腳本,還是make工具,最終都需要調用gcc(或者其它編譯器)來進行實際的編譯工作。
另外,各種軟體也經常需要使用gcc的新版特性,并且與舊版gcc共存,根據實際的需求進行調用。
glibc
Glibc是非交叉編譯環境下,從源碼編譯安裝gcc必備的。
如果是交叉編譯的環境,即在一種硬體架構/作業系統上編譯(主控端),但是生成的二進制可執行檔案要在另一種硬體架構/作業系統上運作(目标機),
在這種情況下,不能依賴主控端器上已編譯的C庫,最好是自行下載下傳glibc的源碼并編譯。
glibc-static
libstdc++
gcc
gcc-c++
為了能順利的yum安裝,重新配置了CD光牒和aliyun的yum源
是以,編譯安裝新版本的gcc元件,需要準備以下3個軟體包
gcc gcc-c++ glibc-static
會自動解決依賴關系
驗證這3個軟體包的狀态
編譯器( cc1 )預連結器( collect2 )連結器 ( ld ) 彙編器 ( as )
cc1負責對源檔案實際的編譯工作;
collect2進行預連結處理,實際的連結由連結器ld完成;
安裝到以下路徑
頭檔案在以下目錄
gcc4.4.7版本開始,官方推薦使用單獨的目錄,而不是在解壓gcc源碼後的目錄中進行編譯,
原因在于:
優化以及生成性能更好的二進制可執行檔案;
避免不可預期的錯誤發生;
避免污染源碼所在目錄;
是以,我們需要在檔案系統的指定目錄下建立1個用于編譯的目錄
并使用configure腳本的 --prefix=/usr/local/[自定義的路徑名稱] 來指定安裝目錄,這樣,gcc的可執行檔案,庫檔案,頭檔案就會井然有序分别存放在相應的子目錄下,
以後不用時直接 rm -rf 整個安裝路徑就可以了。這就是編譯安裝的好處,你清晰的知道所有産生的檔案來自哪裡。
CentOS 7 使用4.8.5,一般情況下這個版本的編譯器已經滿足需要了。
考慮到與Centos 7的相容性,這裡選擇了gcc 4.8.5
去官網下載下傳gcc4.8.5源碼包
ftp://gcc.gnu.org/pub/gcc/releases
編譯安裝 GCC 需要依賴 cloog gmp mpc mpfr isl
其中 isl 并不是編譯gcc必需,但是可以優化生成的可執行檔案,是以推薦下載下傳。
特别提醒:
不同版本軟體的互相組合,可能并不會預期的正常編譯,導緻後面的make第一階段make退出。下面是我測試了幾種組合得到的結果,盡可能的使用了高版本。
聯合編譯時間較長,希望這表能幫助你節約時間。
将這5個依賴庫的源碼包,解壓到gcc源碼目錄下,由于gcc編譯規則隻能識别不帶版本号的子目錄名稱,
是以,還需要将其重命名。這樣在gcc編譯的時候,會自動編譯相關的元件
由于之前使用yum安裝gcc舊版本編譯器的時候,安裝了一些與編譯依賴包相同的包,會不會産生沖突?
結論是:不會,因為這5個依賴庫是編譯gcc源碼時才需要的,而且使用單獨的編譯目錄來存儲中間編譯好的檔案,就是為了避免這種問題。
當然,還有更簡單的方法,運作源碼包中的contrib/download_prerequisites這個腳本,會自動下載下傳相應的依賴包。可以檢視這個腳本内容。一般來說,較新的源碼包會下載下傳較新的依賴包。
不過,下載下傳速度真的是慢,建議自行下載下傳吧。
至此,準備工作就緒。
使用vim等編輯工具打開config.log,查找error關鍵字,搜尋configure檢測到的潛在配置錯誤和警告,這對後面的make階段能否正常編譯至關重要,是以要謹慎對待。如果沒有任何與error相關的警告資訊,那麼就認為可以執行 make 指令。
conftest.cpp:11:2: error: #error -static-libstdc++ not implemented 忽略它也能正常編譯,未能找到解決的方法。
如果需要重新configure或make中途出錯退出,最好把目前目錄下的所有東西都删除幹淨。
也可以執行下面指令清空 編譯目錄下的相關檔案,包括makefile
make指令中的-j 指定同時開啟的程序數,要充分發揮多核處理器的并行執行優勢,這個值應該是處理器晶片上實體核心的2倍。CPU給不給力就看這個了。
最終整個編譯目錄占用了2.7GB空間,消耗的時間在40~50分鐘内
根據編譯前的設定,在指定目錄生成了對應的gcc檔案夾
查驗版本
需要将新版gcc的庫檔案安裝路徑,添加到“庫的搜尋路徑”(LD_LIBRARY_PATH)這個環境變量中,前面在make install結束時,系統也給出了類似的提示資訊(參考前面的截圖):
臨時生效:
永久生效:
到這裡,系統會優先根據PATH路徑的先後順序直接加載使用最新版本的gcc工具。已經可以正常工作了。可以檢視後面的測試章節。
如果是需要gcc多版本共存的情況,請直接跳至下面的 多版本gcc共存 開始閱讀。
make這種自動編譯大型項目的工具隻會使用cc作為編輯器,而cc則是指向舊的gcc程式,
以下是網上說的更新某個動态庫,我并沒有這麼做,也能正常的把mariadb 10.2.12編譯成功。留着備用吧。
至此,前面生成的一些編譯目錄和源碼相關檔案都可以按你的需要進行清理了。
有時候由于各種原因需要将不同版本的gcc編譯器都同時存在系統中,友善進行調用。如果隻是開發單獨在編譯的時候需要的話,僅僅将對應版本路徑直接執行就可以了,個人單獨配置LD_LIBRARY_PATH。
當是以系統級别整體切換的時候,那就需要用到一個小工具了。
alternatives是dpkg的實用工具,用來維護系統指令的符号連結,以決定系統預設使用什麼指令。
使用此工具管理指令時,必須要配置環境變量的PATH路徑。如:/usr/local/gcc-4.8.5/bin
文法說明:
自動切換配合--auto動作,并設定好優先級數字,數字越大,優先級越高。手動方式切換後,将會取消自動切換。
從手動切換回自動,alternatives --auto gcc
這是使用系統舊版本4.4.7 gcc編譯cmake時的提示,并且報錯退出。
這是使用新版本4.8.5 gcc編譯cmake時的提示,已經沒有報錯了
本文轉自 ljpwinxp 51CTO部落格,原文連結:http://blog.51cto.com/191226139/2066137