在 OS X 下编译 GCC

来源:互联网 发布:华尔街英语软件下载 编辑:程序博客网 时间:2024/05/22 08:22

http://www.oschina.net/translate/compiling-gcc-mac-os-x?p=1


在这篇文档里,我将向你介绍如何在你的OS X计算机上使用Graphite循环优化从源代码编译、安装目前稳定版本的GCC。这篇文档中的指令都是在Xcode 4.6.4和 Mountain Lion(OS X 10.8.4)下测试通过的。

OS X默认的编译器Clang仅仅支持C,C++和Objective-C。比如,假设你对现代的Fortran编译器感兴趣,那么你就需要与GCC一起的gfortran。让最新稳定版的GCC运行在你的Mac上的另一个理由是这个编译器可以为你提供另一个C和C++编译器选择。使用两个不同的编译器对你的代码进行测试一直以来都是很好的想法。

为了对GCC源代码进行编译,你需要有一个可以运行的C++编译器,请你优先选择旧版本的GCC。在这篇文档的其余部分里,我假设你已经安装了Xcode的命令行工具。在我写这篇文档的时候,Apple的命令行工具里包含llvm-gcc-4.2。

几点人
几点人
翻译于 11个月前

0人顶

 翻译的不错哦!

让我们开始从GUN的互联网站点下载最新稳定版本的GCC,进入http://gcc.gnu.org/mirrors.html,然后下载gcc-4.8.1.tar.bz2。我已经把这个压缩包保存在我的Downloads文件夹里了。

为了成功的构建gcc,我们还需要三个其他的库: mpc  mpfr  gmp 。使用上面的链接,然后下载这三个库的最新版本:gmp-5.1.2.tar.bz2、 

mpc-1.0.1.tar.gz和mpfr-3.1.2.tar.bz2,仍旧把它们保存在Downloads文件夹下。

为了启用Graphite循环优化,你还需要另外两个库,进入ftp://gcc.gnu.org/pub/gcc/infrastructure/,下载isl-0.11.1.tar.bz2和cloog-0.18.0.tar.gz。

解压Downloads文件夹下这六个压缩包,然后打开一个终端窗口。

几点人
几点人
翻译于 11个月前

0人顶

 翻译的不错哦!

我们将从编译gmp库开始:

1
2
cd Downloads
cd gmp*

在编译器保存已编译库的文件夹里创建一个名字为build的文件夹:

1
mkdir build && cd build

现在,到了令人高兴的部分了......在终端输入:

1
../configure --prefix=/usr/gcc-4.8.1 --enable-cxx

如果你没有看到任何错误,那么你实际上可以编译gmp库了:

1
make -j 4

几分钟后,你将对gmp库完成编译。如果你没有看到任何错误......那么祝贺你,你准备好安装gmp库到/usr/gcc-4.8.1/文件夹下( 要完成安装,你需要管理员密码):

1
sudo make install

现在我们对MPFR库做同样的操作:

1
2
3
4
cd ..
cd ..
cd mpfr*
mkdir build && cd build

配置阶段:

1
../configure --prefix=/usr/gcc-4.8.1 --with-gmp=/usr/gcc-4.8.1

第二个参数只是告诉配置应用gmp已经安装到/usr/gcc-4.8.1下

配置阶段结束后,我们就可以构建和安装这个库了:

1
2
make -j 4
sudo make install

接下来,我们将构建MPC:

1
2
3
4
5
6
7
cd ..
cd ..
cd mpc*
mkdir build && cd build
../configure --prefix=/usr/gcc-4.8.1 --with-gmp=/usr/gcc-4.8.1 --with-mpfr=/usr/gcc-4.8.1
make -j 4
sudo make install

此时,你应该已经完成了GCC必须的库的构建和安装了。

下一步就是构建Graphite循环优化所需要的库:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cd ..
cd ..
cd isl*
mkdir build && cd build
../configure --prefix=/usr/gcc-4.8.1 --with-gmp-prefix=/usr/gcc-4.8.1
make -j 4
sudo make install
 
cd ..
cd ..
cd cloog*
mkdir build && cd build
../configure --prefix=/usr/gcc-4.8.1 --with-gmp-prefix=/usr/gcc-4.8.1 --with-isl-prefix=/usr/gcc-4.8.1
make -j 4
sudo make install

几点人
几点人
翻译于 11个月前

0人顶

 翻译的不错哦!

现在,我们准备编译GCC。我们要有这样的思想准备:在某些机器上,编译可能要花一个多小时......由于我只对C、C++和Fortran编译器感兴趣,因此下面就是我在我的机器上所使用的配置命令:

1
2
3
../configure --prefix=/usr/gcc-4.8.1 --enable-checking=release --with-gmp=/usr/gcc-4.8.1 --with-mpfr=/usr/gcc-4.8.1 --with-mpc=/usr/gcc-4.8.1 --enable-languages=c,c++,fortran --with-isl=/usr/gcc-4.8.1 --with-cloog=/usr/gcc-4.8.1 --program-suffix=-4.8.1
make -j 4
sudo make install

上面的命令指导着我们在安装gmp、mpfr、mpc、ppl和 cloog库时使用过的配置应用。另外,这个配置命令还告诉你在所有最终的 执行程序的前面增加一个前缀,比如,假设你要调用的是GCC 4.8.1,那么你就书写成gcc-4.8.1,gcc命令将调用的是Apple内置 的编译器gcc 4.2。

如果你想构建GCC包里的其他编译器,那么请修改--enable-languages配置选项。

几点人
几点人
翻译于 11个月前

0人顶

 翻译的不错哦!

接下来,最后一次键入:

1
make -j 4

喝咖啡、也许是看书,接着就是等待......根据计算机配置的不同,这个过程大概可能需要一个小时......或者更多......,而且 构建文件夹需要占用大约2GB的磁盘空间。

安装编译好的gcc到/usr/gcc-4.8.1下:

1
sudo make install

现在,你已经让新编译器完全独立于Apple本身的gcc编译器了,如果你要使用新编译器,那么只要在终端输入下面命令,修改路径就行:

1
export PATH=/usr/gcc-4.8.1/bin:$PATH

如果你不想每次打开终端输入上面命令,那么就把上面的命令保存到你的用户目录下的.bash_profile文件里。

你应该能调用任何新编译的编译器: C 、C++ Fortran......,在终端输入下面命令,就可以轻松地调用g++了:

1
g++-4.8.1 test.cpp -o test

记住:如果你打算释放一些磁盘空间,请删除Downloads下的build目录。

几点人
几点人
翻译于 11个月前

0人顶

 翻译的不错哦!

让我们看一下g++-4.8.1是否可以编译C++11的某些特性。在你比较喜欢的文本编辑器里,拷贝、保存下面的测试程序(我假设你把这个文件保存在你自己的用户目录里):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//这个程序用来测试新增的C++11 Lambda语法和初始化列表
 and initalizer lists
#include <iostream>
#include <vector>
 
using namespace std;
 
int main()
{
  // lambda测试
  cout << [](int m, int n) { return m + n;} (2,4) << endl;
 
  //测试的循环要用到的初始化列表和范围
  vector<int> V({1,2,3});
 
  cout << "V =" << endl;
  for(auto e : V) {
    cout << e << endl;
  }
 
  return 0;
}

编译,运行上面的lambda例程:

1
2
3
4
5
6
7
g++-4.8.1 -std=c++11 tst_lambda.cpp -o tst_lambda
./tst_lambda
6
V =
1
2
3

我们还可以使用C++11里新增的thread头文件编译C++代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//由主程序创建C++11线程
 
#include <iostream>
#include <thread>
 
//线程将调用的函数
void call_from_thread() {
    std::cout << "Hello, World!" << std::endl;
}
 
int main() {
    //启动线程
    std::thread t1(call_from_thread);
 
    //把线程连接到主线程
    t1.join();
     
    return 0;
}

如果你是Frotran开发人员,那么你可以使用像gfortran-4.8.1中do councurrent这样Fortran 2008才具有的一些功能:

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

上面的代码可以使用下面命令编译(假设你命名上面的文件为tst_concurrent_do.f90):

1
2
gfortran-4.8.1 tst_concurrent_do.f90 -o tst_concurrent_do
./tst_concurrent_do

0 0
原创粉丝点击