本文將介紹如何在 Ubuntu 12.04 下編譯 gcc 4.7,我很奇怪的是在 Ubuntu 下編譯 gcc 源碼也那麼復雜,不過 Ubuntu 也是 Linux 系統之一,就沒什麼好奇怪的了。
首先檢查你是否已經默認安裝 Ubuntu gcc 和 binutils ,如果你使用了 64 位的桌面版本,那麼默認是已經安裝了。下面的部分我們建議你打開一個終端來執行相應的命令。
在此之前建議更新下系統,執行如下命令:
1
sudo apt-get install update
2
sudo apt-get install upgrade
接下來我們需要安裝一些所需的軟件包:
1
sudo apt-get install g++
2
sudo apt-get install gawk
3
sudo apt-get install m4
4
sudo apt-get install gcc-multilib
然後從 GNU 網站上下載最新的 gcc-4.7 源碼,請訪問 http://gcc.gnu.org/mirrors.html 然後選擇 gcc-4.7 的最新穩定版本,文件名是 gcc-4.7.0.tar.bz2. 將它保存到本地。
你還需要另外三個庫才能成功編輯 gcc,這三個庫分別是:mpc, mpfr 和 gmp. 使用鏈接進入下載最新版本分別是:gmp-5.0.4.tar.bz2, mpc-0.9.tar.gz 和 mpfr-3.1.0.tar.gz ,並且保存到跟 gcc 4.7 源文件所在的同一個目錄。
打開終端進入上述幾個文件所在的目錄:
1
cd ~
2
cd Downloads
我們先開始編譯 gmp 庫
1
cd gmp*
2
mkdir build && cd build
3
../configure --prefix=/usr/gcc_4_7 --build=x86_64-linux-gnu
4
make
5
sudo make install
幾分鐘後你將有一個已編譯好和安裝好的 gmp 庫,如果一切順利,恭喜你!
使用相同的步驟來編譯 MPFR:
1
cd ..
2
cd ..
3
cd mpfr*
4
mkdir build && cd build
5
../configure --build=x86_64-linux-gnu --prefix=/usr/gcc_4_7 --with-gmp=/usr/gcc_4_7
6
make
7
sudo make install
緊接著是 MPC:
1
cd ..
2
cd ..
3
cd mpc*
4
mkdir build && cd build
5
../configure --build=x86_64-linux-gnu --prefix=/usr/gcc_4_7 --with-gmp=/usr/gcc_4_7 --with-mpfr=/usr/gcc_4_7
6
make
7
sudo make install
到這一步就完成個 gcc 所需包的編譯和安裝,在某些機器上這三者的編譯可能超過一個小時,做好心理准備。
接下來我們可以開始編譯 C/C++ 和 Fortran 編譯器:
01
cd ..
02
cd ..
03
mkdir build && cd build
04
export LIBRARY_PATH=/usr/lib/x86_64-linux-gnu/
05
export C_INCLUDE_PATH=/usr/include/x86_64-linux-gnu
06
export CPLUS_INCLUDE_PATH=/usr/include/x86_64-linux-gnu
07
../gcc-4.7.0/configure --build=x86_64-linux-gnu --prefix=/usr/gcc_4_7 --with-gmp=/usr/gcc_4_7 --with-mpfr=/usr/gcc_4_7 --with-mpc=/usr/gcc_4_7 --enable-checking=release --enable-languages=c,c++,fortran --disable-multilib --program-suffix=-4.7
08
make
09
sudo ln -s /usr/lib/x86_64-linux-gnu /usr/lib64
10
sudo make install
下面命令可將 gcc 4.7 添加到系統路徑中,或者直接編輯 .bashrc 文件並在最後添加下面一行:
1
export PATH=/usr/gcc_4_7/bin:$PATH
你不知道什麼是 .bashrc 文件?沒關系,打開終端執行:
1
cd ~
2
gedit .bashrc
使用下面命令重新加載 .bashrc 文件:
1
./.bashrc
下面是調用編譯器的簡單方法
1
g++-4.7 test.cpp -o test
如果你的磁盤空間緊張,記得刪除源碼文件目錄下的 *build* 子目錄。
接下來我們檢查 g++-4.7 是否能編譯一些 C++11 規范的代碼,打開你喜好的編輯器,復制下面一段代碼並保持該文件為 tst_lambda.cpp:
01
//Program to test the new C++11 lambda syntax
02
#include <iostream>
03
04
using namespace std;
05
06
int main()
07
{
08
cout << [](int m, int n) { return m + n;} (2,4) << endl;
09
return 0;
10
}
編譯並運行上述 lambda 示例將返回 6:
1
g++-4.7 -std=c++11 tst_lambda.cpp -o tst_lambda
2
./tst_lambda
3
6
g++-4.7 同時也支持 C++11 線程:
01
//Create a C++11 thread from the main program
02
03
#include <iostream>
04
#include <thread>
05
06
//This function will be called from a thread
07
void call_from_thread() {
08
std::cout << "Hello, World!" << std::endl;
09
}
10
11
int main() {
12
//Launch a thread
13
std::thread t1(call_from_thread);
14
15
//Join the thread with the main thread
16
t1.join();
17
18
return 0;
19
}
如果你是一個 Fortran 開發者,你可以使用 Fortran 2008 特性,例如 do concurrent
01
integer,parameter::mm=100000
02
real::a(mm), b(mm)
03
real::fact=0.5
04
05
! initialize the arrays
06
! ...
07
08
do concurrent (i = 1 : mm)
09
a(i) = a(i) + b(i)
10
enddo
11
12
end
編譯並執行上述代碼:
1
gfortran-4.7 tst_concurrent_do.f90 -o tst_concurrent_do
2
./tst_concurrent_do
至此,你已經完成了在 Ubuntu 12.04 上編譯 GCC 4.7 的所有步驟。