本文将介绍如何在 Ubuntu 12.04 下编译 gcc 4.7,我很奇怪的是在 Ubuntu 下编译 gcc 源码也那么复杂,不过 Ubuntu 也是 Linux 系统之一,就没什么好奇怪的了。
首先检查你是否已经默认安装 Ubuntu gcc 和 binutils ,如果你使用了 64 位的桌面版本,那么默认是已经安装了。下面的部分我们建议你打开一个终端来执行相应的命令。
在此之前建议更新下系统,执行如下命令:
1
2
|
sudo
apt-get
install
update
sudo
apt-get
install
upgrade
|
接下来我们需要安装一些所需的软件包:
1
2
3
4
|
sudo
apt-get
install
g++
sudo
apt-get
install
gawk
sudo
apt-get
install
m4
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
2
|
cd
~
cd
Downloads
|
我们先开始编译 gmp 库
1
2
3
4
5
|
cd
gmp*
mkdir
build &&
cd
build
..
/configure
--prefix=
/usr/gcc_4_7
--build=x86_64-linux-gnu
make
sudo
make
install
|
几分钟后你将有一个已编译好和安装好的 gmp 库,如果一切顺利,恭喜你!
使用相同的步骤来编译 MPFR:
1
2
3
4
5
6
7
|
cd
..
cd
..
cd
mpfr*
mkdir
build &&
cd
build
..
/configure
--build=x86_64-linux-gnu --prefix=
/usr/gcc_4_7
--with-gmp=
/usr/gcc_4_7
make
sudo
make
install
|
紧接着是 MPC:
1
2
3
4
5
6
7
|
cd
..
cd
..
cd
mpc*
mkdir
build &&
cd
build
..
/configure
--build=x86_64-linux-gnu --prefix=
/usr/gcc_4_7
--with-gmp=
/usr/gcc_4_7
--with-mpfr=
/usr/gcc_4_7
make
sudo
make
install
|
到这一步就完成个 gcc 所需包的编译和安装,在某些机器上这三者的编译可能超过一个小时,做好心理准备。
接下来我们可以开始编译 C/C++ 和 Fortran 编译器:
1
2
3
4
5
6
7
8
9
10
|
cd
..
cd
..
mkdir
build &&
cd
build
export
LIBRARY_PATH=
/usr/lib/x86_64-linux-gnu/
export
C_INCLUDE_PATH=
/usr/include/x86_64-linux-gnu
export
CPLUS_INCLUDE_PATH=
/usr/include/x86_64-linux-gnu
..
/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
make
sudo
ln
-s
/usr/lib/x86_64-linux-gnu
/usr/lib64
sudo
make
install
|
下面命令可将 gcc 4.7 添加到系统路径中,或者直接编辑 .bashrc 文件并在最后添加下面一行:
1
|
export
PATH=
/usr/gcc_4_7/bin
:$PATH
|
你不知道什么是 .bashrc 文件?没关系,打开终端执行:
1
2
|
cd
~
gedit .bashrc
|
使用下面命令重新加载 .bashrc 文件:
1
|
./.bashrc
|
下面是调用编译器的简单方法
1
|
g++-4.7
test
.cpp -o
test
|
如果你的磁盘空间紧张,记得删除源码文件目录下的 *build* 子目录。
接下来我们检查 g++-4.7 是否能编译一些 C++11 规范的代码,打开你喜好的编辑器,复制下面一段代码并保持该文件为 tst_lambda.cpp:
1
2
3
4
5
6
7
8
9
10
|
//Program to test the new C++11 lambda syntax
#include <iostream>
using
namespace
std;
int
main()
{
cout << [](
int
m,
int
n) {
return
m + n;} (2,4) << endl;
return
0;
}
|
编译并运行上述 lambda 示例将返回 6:
1
2
3
|
g++-4.7 -std=c++11 tst_lambda.cpp -o tst_lambda
.
/tst_lambda
6
|
g++-4.7 同时也支持 C++11 线程:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
//Create a C++11 thread from the main program
#include <iostream>
#include <thread>
//This function will be called from a thread
void
call_from_thread() {
std::cout <<
"Hello, World!"
<< std::endl;
}
int
main() {
//Launch a thread
std::
thread
t1(call_from_thread);
//Join the thread with the main thread
t1.join();
return
0;
}
|
如果你是一个 Fortran 开发者,你可以使用 Fortran 2008 特性,例如 do concurrent
1
2
3
4
5
6
7
8
9
10
11
12
|
integer,parameter::mm=100000
real::a(mm), b(mm)
real::fact=0.5
! initialize the arrays
! ...
do concurrent (i = 1 : mm)
a(i) = a(i) + b(i)
enddo
end
|
编译并执行上述代码:
1
2
|
gfortran-4.7 tst_concurrent_do.f90 -o tst_concurrent_do
.
/tst_concurrent_do
|