mk-mode BLOG

このブログは自作の自宅サーバに構築した Debian GNU/Linux で運用しています。
PC・サーバ構築等の話題を中心に公開しております。(クローンサイト: GitHub Pages

ブログ開設日2009-01-05
サーバ連続稼働時間
Reading...
Page View 合計
Reading...
今日
Reading...
昨日
Reading...

GCC - 最新版をソースビルドでインストール(on Linux Mint)!

[ プログラミング ] [ C言語, Fortran, GCC, LinuxMint, ObjectiveC ]

パッケージでインストールされる GCC(GNU Compiler Collection) はバージョンが若干古く、新しいバージョンで搭載された機能を試す(使用する)ことができません。
(例えば、旧バージョンでは boost ライブラリを使用しなければならなかった “regex” が標準で使用できるようになっている、等)

そこで、最新バージョンをソースをビルドしてインストールしてみました。(Linux Mint 17 64bit へ)

0. 前提条件

  • Linux Mint 17 での作業を想定しているが Debian 系はどれも同様と思われる。
  • パッケージ版 GCC インストール済み。(バージョンは 4.8.2 を想定)
  • 新たにインストールする GCC は 4.9.1 を想定。(当記事執筆時点で最新バージョン)
  • インストール先は “/usr/local/gcc-4.9.1” を想定。
  • コンパイルできるようにする言語は C, C++, Objective-C, Fortran とする。
  • インストール済みのパッケージ版 GCC は他のパッケージ管理等で影響が出ると面倒なのでアンインストールしない。
  • 念の為、インストール済みパッケージをアップデートしておく。

1. アーカイブダウンロード

ミラーサイト一覧「GCC mirror sites - GNU Project - Free Software Foundation (FSF)」から適当なサイトを選んでアーカイブ(サイズ:約110MB)をダウンロードする。
そして、展開しておく。

1
2
$ wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-4.9.1/gcc-4.9.1.tar.gz
$ tar zxvf gcc-4.9.1.tar.gz

2. 依存パッケージインストール

download_prerequisites を実行することで依存パッケージ(MPFR, GMP, MPC, ISL, CLOOG)がインストールされる。(シンボリックリンクが張られる)

1
2
$ cd gcc-4.9.1
$ ./contrib/download_prerequisites

3. ビルド&インストール

ビルド用ディレクトリを作成し、 configure, make, make install を行う。
C, C++, Objective-C, Objective-C++, Fortran, Java, Ada, Go がインストール可能であるが、今回は C, C++, Objective-C, Fortran をインストールする。

1
2
3
4
5
6
7
8
9
10
$ cd ..
$ mkdir build
$ cd build
$ ../gcc-4.9.1/configure --prefix=/usr/local/gcc-4.9.1 --enable-languages=c,c++,objc,fortran --disable-multilib --disable-bootstrap
$ export LD_LIBRARY_PATH=/usr/local/gcc-4.9.1/lib:$LD_LIBRARY_PATH
$ 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
$ make
$ sudo make install
  • configure--enable-languages でインストールする言語を指定する。
    今回は c,c++,objc,fortran とした。他に指定可能の言語は ada, go, java, obj-c++ で、全てインストールする場合は all を指定する。
    (インストールする言語を明示しない場合は、 C, C++, Objective-C, Fortran, Java がデフォルトでインストールされる)
  • configure--disable-multilib オプションは 32bit ライブラリを探そうとしないようにするために付加する。
    (現時点では 64bit のみの開発を想定しているため)
  • configure--disable-bootstrap は bootstrap ビルドを行わないオプション。
    コンパイルを3回繰り返して行い自分自身を完璧なものにするためのオプションらしいが、時間がかかるらしいので無効化(ビルド1回に)する。(それで問題ないようなので)
  • make の直前の export コマンドはパスが通ってないことによるエラーを回避するため。
  • make -j 4 等のように並列化して高速化を図っても良いだろう。

ちなみに、当方の非力な環境で make に約30分、 make install に約1分かかった。

4. シンボリックリンク設定

既にインストール済みの旧バージョンの GCC を共存させたいので、以下のようにパスの通っているディレクトリに名前を付けてシンボリックリンクを張る。

1
2
3
# sudo ln -s /usr/local/gcc-4.9.1/bin/gcc /usr/local/bin/gcc49
# sudo ln -s /usr/local/gcc-4.9.1/bin/g++ /usr/local/bin/g++49
# sudo ln -s /usr/local/gcc-4.9.1/bin/gfortran /usr/local/bin/gfortran49

5. 動作確認

バージョンを表示させてインストールできているか確認してみる。(比較のために、既存のパッケージでインストールしたものと、今回ソースビルドでインストールしたもの)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
$ gcc --version
gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ g++ --version
g++ (Ubuntu 4.8.2-19ubuntu1) 4.8.2
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ gfortran --version
GNU Fortran (Ubuntu 4.8.2-19ubuntu1) 4.8.2
Copyright (C) 2013 Free Software Foundation, Inc.

GNU Fortran comes with NO WARRANTY, to the extent permitted by law.
You may redistribute copies of GNU Fortran
under the terms of the GNU General Public License.
For more information about these matters, see the file named COPYING

$ gcc49 --version
gcc49 (GCC) 4.9.1
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ g++49 --version
g++49 (GCC) 4.9.1
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ gfortran49 --version
GNU Fortran (GCC) 4.9.1
Copyright (C) 2014 Free Software Foundation, Inc.

GNU Fortran comes with NO WARRANTY, to the extent permitted by law.
You may redistribute copies of GNU Fortran
under the terms of the GNU General Public License.
For more information about these matters, see the file named COPYING

既存の GCC も今回ソースインストールした GCC も問題なくバージョン情報が表示されることを確認。

6. 動作確認・その2

実際に簡単なソースコードを作成し、ビルドして動作を確認してみる。
例として、1 から 100 までの総和を求めるコードを作成した。(C++, Objective-C はオブジェクト指向コーディング)

6-1. C テスト

TestSumC.c
1
2
3
4
5
6
7
8
9
#include <stdio.h>

void main()
{
    int iMax = 100;
    int i, iSum;
    for (i = 1; i <= iMax; i++) iSum += i;
    printf("1 + ... + %d = %d\n", iMax, iSum);
}
1
2
3
$ gcc49 -o TestSumC TestSumC.c
$ ./TestSumC
1 + ... + 100 = 5050

6-2. C++ テスト

TestSumCPP.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>

using namespace std;

class Proc
{
    int i;
    int iSum;
public:
    Proc();
    void calc(int);
    int  getSum();
};

Proc::Proc(){
    iSum = 0;
}

void Proc::calc(int m)
{
    for (i = 1; i <= m; i++) iSum += i;
}
int Proc::getSum() {
    return iSum;
}

int main()
{
    int iMax = 100;
    Proc objMain;
    objMain.calc(iMax);
    cout << "1 + ... + " << iMax << " = " << objMain.getSum() << endl;
    return 0;
}
1
2
3
$ g++49 -o TestSumCpp TestSumCpp.cpp
$ ./TestSumCPP
1 + ... + 100 = 5050

6-3. Objective-C テスト

(Linux Mint 環境では、 Object でなく NSObject を継承するために libgnustep-base-dev がインストール済みであること)

TestSumM.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#import <Foundation/NSObject.h>

@interface Proc: NSObject {
    int i;
    int iSum;
}
-init;
-calc :(int) m;
-(int) getSum;
@end

@implementation Proc
-init
{
    iSum = 0;
    return self;
}
-calc :(int) m
{
    for (i = 1; i <= m; i++) iSum += i;
    return self;
}
-(int) getSum { return iSum; }
@end

int main() {
    int iMax = 100;
    id objMain = [[Proc alloc] init];
    [objMain calc: iMax];
    printf("1 + ... + %d = %d\n", iMax, [objMain getSum]);
    return 0;
}
1
2
3
$ g++49 -o TestSumM TestSumM.m -lobjc -lgnustep-base -I/usr/include/GNUstep
$ ./TestSumM
1 + ... + 100 = 5050

6-4. Fortran テスト

TestSumF.f95
1
2
3
4
5
6
7
8
9
program TestSumF
  integer :: iMax = 100
  integer :: i, iSum = 0

  do i = 1, iMax
    iSum = iSum + i
  enddo
  write(*, "(a,i3,a,i4) ") "1 + ... + ", iMax, " = ", iSum
end program TestSumF
1
2
3
$ gfortran49 -o TestSumF TestSumF.f95
$ ./TestSumF
1 + ... + 100 = 5050

7. その他

今回のようにソースをビルドしてインストールするのではなく、リポジトリを追加してインストールするのなら、以下のようにすればよいらしい。(当方未確認)

1
2
3
$ sudo add-apt-repository ppa:ubuntu-toolchain-r/test
$ sudo apt-get update
$ sudo apt-get install g++-4.9

また、新しいバージョンの GCC でコンパイルしたものがライブラリの関係で正常に動作しないこともあるかも知れない。("libstdc++.so.6" 関連等)
その場合は適切にライブラリパスの設定を行う必要があるだろう。(既存の “libstdc++.so.6” を 新しい “libstdc++.so.6” と置き換える等)

参考サイト

インストールに関しては


通常はパッケージでインストールできる GCC で十分でしょうが、新しい機能を標準で利用したかったらソースからインストールしてみるのもよいでしょう。

以上。

Comments