Debian 11 (bullseye) - GCC 11.2 インストール(ソースビルド)!
Updated:
Debian GNU/Linux 11 へ最新版 GCC をソースビルドでインストールする方法についての記録です。
0. 前提条件
- Debian GNU/Linux 11.2.0 (bullseye; 64bit) での作業を想定。
- root ユーザでの作業を想定。
- パッケージ版 GCC インストール済み。(バージョンは 8.3.0 を想定)
- 新たにインストールする GCC は 11.2.0 を想定。(当記事執筆時点で最新バージョン)
- インストール先は
/usr/local/gcc-11.2.0
を想定。 - コンパイルできるようにする言語は C, C++, Objective-C, Fortran とする。
- インストール済みのパッケージ版 GCC は他のパッケージ管理等で影響が出ると面倒なのでアンインストールしない。(GCC 8.3.0 と 11.2.0 を共存させる)
- 念の為、インストール済みパッケージをアップデートしておく。
1. アーカイブダウンロード
ミラーサイト一覧「GCC mirror sites - GNU Project - Free Software Foundation (FSF)」から適当なサイトを選んでアーカイブ(サイズ:約110MB)をダウンロードする。
そして、展開しておく。
# cd /usr/local/src
# wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-11.2.0/gcc-11.2.0.tar.gz
# tar xvf gcc-11.2.0.tar.gz
2. 依存パッケージインストール
download_prerequisites
を実行することで依存パッケージ(MPFR, GMP, MPC, ISL, CLOOG)がインストールされる。(シンボリックリンクが張られる)
# cd gcc-11.2.0
# ./contrib/download_prerequisites
3. ビルド&インストール
ビルド用ディレクトリを作成し、 configure
, make
, make install
を行う。
C, C++, Objective-C, Objective-C++, Fortran, Java, Ada, Go がインストール可能であるが、今回は C, C++, Objective-C, Fortran をインストールする。
# cd ..
# mkdir build
# cd build
# ../gcc-11.2.0/configure --prefix=/usr/local/gcc-11.2.0 --enable-languages=c,c++,objc,fortran --disable-multilib --disable-bootstrap
# export LD_LIBRARY_PATH=/usr/local/gcc-11.2.0/lib64:$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
# 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 -j4
等のように並列化して高速化を図っても良いだろう。
ちなみに、非力な環境では make
に相当な時間がかかる。
4. シンボリックリンク設定
既にインストール済みの旧バージョンの GCC を共存させたいので、以下のようにパスの通っているディレクトリに名前を付けてシンボリックリンクを張る。
# ln -s /usr/local/gcc-11.2.0/bin/gcc /usr/local/bin/gcc112
# ln -s /usr/local/gcc-11.2.0/bin/g++ /usr/local/bin/g++112
# ln -s /usr/local/gcc-11.2.0/bin/gfortran /usr/local/bin/gfortran112
5. ライブラリ PATH の設定
今回インストールした GCC 用のライブラリを使用するよう PATH
を設定する。(シェル(bash, zsh 等)設定ファイルに記述を追加する)
File: /etc/profile
1
2
LD_LIBRARY_PATH="/usr/local/gcc-11.2.0/lib64:$LD_LIBRARY_PATH"
export LD_LIBRARY_PATH
そして、即反映
# source ~/.profile
6. 動作確認
バージョンを表示させてインストールできているか確認してみる。(比較のために、既存のパッケージでインストールしたものと、今回ソースビルドでインストールしたもの)
(gfortran
はデフォルトではインストールされていなかった)
# gcc --version
gcc (Debian 10.2.1-6) 10.2.1 20210110
Copyright (C) 2020 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++ (Debian 10.2.1-6) 10.2.1 20210110
Copyright (C) 2020 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.
# gcc112 --version
gcc112 (GCC) 11.2.0
Copyright (C) 2021 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++112 --version
g++112 (GCC) 11.2.0
Copyright (C) 2021 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.
# gfortran112 --version
GNU Fortran (GCC) 11.2.0
Copyright (C) 2021 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.
既存の GCC も今回ソースインストールした GCC も問題なくバージョン情報が表示されることを確認。
7. 動作確認・その2
実際に簡単なソースコードを作成し、ビルドして動作を確認してみる。
例として、1 から 100 までの総和を求めるコードを作成した。(C++, Objective-C はオブジェクト指向コーディング)
7-1. C テスト
File: 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);
}
$ gcc112 -o TestSumC TestSumC.c
$ ./TestSumC
1 + ... + 100 = 5050
7-2. C++ テスト
File: 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;
}
$ g++112 -o TestSumCpp TestSumCpp.cpp
$ ./TestSumCPP
1 + ... + 100 = 5050
7-3. Objective-C テスト
(Debian 環境では、 Object でなく NSObject を継承するために libgnustep-base-dev がインストール済みであること)
File: 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;
}
$ g++112 -o TestSumM TestSumM.m -lobjc -lgnustep-base -I/usr/include/GNUstep
$ ./TestSumM
1 + ... + 100 = 5050
7-4. Fortran テスト
File: 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
$ gfortran112 -o TestSumF TestSumF.f95
$ ./TestSumF
1 + ... + 100 = 5050
8. 参考サイト
インストールに関しては
以上。
Comments