FreeBSD で GNU コンパイラコレクション (GCC) のインストールと設定

◆ この Web ページで行うこと

FreeBSD の基本システム(base system)のコンパイラは Clang/LLVM である. amd64, arm64, i386 などの主要なアーキテクチャでは,基本システムに clang, clang++ が含まれる. GCC は基本システムには含まれず,ポーツ・コレクションまたはパッケージから導入する.

* make buildworld, make buildkernel(基本システムのビルド)には, ポーツからインストールした GCC ではなく,基本システムの Clang を使用する.

* このページの記述は 2026 年 8 月時点の情報に基づく. GCC のバージョン番号やポーツ・コレクションの既定値は更新されるため, 実際のバージョンは /usr/ports/Mk/bsd.default-versions.mkls /usr/ports/lang で確認すること.

前準備

システムの更新

「FreeBSD システムの更新,ポーツコレクションの維持更新」 のページを参考に,次のことを行っておく.

ポーツ・コレクションを新規に取得する場合の操作は次の通り.root で実行する.

git clone --depth 1 https://git.FreeBSD.org/ports.git /usr/ports

ポーツ・コレクションを更新する場合の操作は次の通り.root で実行する.

git -C /usr/ports pull

GCC のインストール

ポーツ・コレクションにおける GCC のバージョン

ポーツ・コレクションでは,GCC のメジャーバージョンごとに lang/gcc12, lang/gcc13, lang/gcc14, lang/gcc15 のようなポーツが用意されている. これらは同時にインストールでき,コマンド名は gcc14, g++14, gfortran14 のように バージョン番号付きになる.

メタポート lang/gcc は,ポーツ・コレクションが定める既定バージョンの GCC を導入し, gcc, g++, gfortran という名前のシンボリックリンクを作成する. 既定バージョンは /usr/ports/Mk/bsd.default-versions.mkGCC_DEFAULT で定義される (2026 年 8 月時点では 14).

パッケージ(pkg)によるインストール

ビルド時間を要しない.公式パッケージリポジトリと同じ設定でよい場合は,この方法が簡便である. root で次のコマンドを実行する.

* 既定バージョンの GCC をインストールする場合

pkg install gcc

* バージョンを指定してインストールする場合(例:GCC 14)

pkg install gcc14

* 次の前提ソフトウェアも自動的にインストールされる.

ポーツ・コレクションによるインストール

オプションを変更してビルドしたい場合は,ポーツ・コレクションを使用する.root で次のコマンドを実行する.

* バージョンを指定してインストールする場合(例:GCC 14)

cd /usr/ports/lang/gcc14
make config-recursive
make
make install clean

* 再インストールしたい場合には,上記の手順の「make install clean」の代わりに 「make deinstall reinstall」を実行する.

cd /usr/ports/lang/gcc14
make config-recursive
make
make deinstall reinstall

* GCC のビルドには長時間(環境により数時間)を要する. 多数のポーツをソースからビルドし,かつ再現性のあるビルド環境が必要な場合は, ports-mgmt/poudriere の使用を検討する.

インストール結果の確認

◆ インストール済みパッケージの確認

pkg info gcc14

◆ バージョンの確認

gcc14 --version
g++14 --version
gfortran14 --version

◆ インストールされたコマンドとライブラリの確認

ls /usr/local/bin/*14*
ls /usr/local/lib/gcc14

◆ 動作確認(C プログラムのコンパイルと実行)

cd /tmp
printf '#include <stdio.h>\nint main(void){ printf("hello\\n"); return 0; }\n' > hello.c
gcc14 -O2 -o hello hello.c
./hello

ポーツ・コレクションでのビルドに GCC を使う設定

既定の GCC バージョンの指定

ポーツ・コレクションでは,USE_GCC=yesUSES=compilerUSES=fortran を 指定したポーツが GCC を必要とする. このときに使用される GCC のバージョンは,/etc/make.conf に次のように書くことで変更できる.

DEFAULT_VERSIONS+=gcc=14

* GCC_DEFAULT のような変数を直接定義してはならない. 直接定義するとポーツ・コレクションの枠組みがエラーを報告する. 指定は上記の DEFAULT_VERSIONS+= の形式で行う.

* 公式のバイナリパッケージは,ポーツ・コレクションの既定値でビルドされている. 既定値を変更した場合,変更の影響を受けるポーツは自分でソースからビルドすることになる.

特定のポーツを GCC でビルドする

ポーツ・コレクションの大半は基本システムの Clang でビルドすることを前提としている. /etc/make.confCC, CXX, CPP を全ポーツに対して上書きする設定は, ポーツ・コレクションでは想定されておらず,ビルド失敗や実行時の不整合の原因になる. GCC を使いたいポーツがある場合は,そのポーツのビルド時にのみ指定する.root で次のコマンドを実行する.

cd /usr/ports/カテゴリ/ポーツ名
make CC=gcc14 CXX=g++14 CPP=cpp14
make install clean

GCC でビルドした実行ファイルやライブラリは,/usr/local/lib/gcc14 にある libstdc++.so, libgcc_s.so, libgfortran.so を必要とする. 実行時にこれらを確実に見つけられるようにするには,rpath を指定する.root で次のコマンドを実行する.

cd /usr/ports/カテゴリ/ポーツ名
make CC=gcc14 CXX=g++14 CPP=cpp14 LDFLAGS+="-Wl,-rpath,/usr/local/lib/gcc14 -Wl,-rpath,/usr/local/lib"
make install clean

インストール済みソフトウェアの入れ替え

コンパイラを変更した後に,既存のソフトウェアを新しい設定でビルドし直したい場合がある. その場合は ports-mgmt/poudriere でパッケージ一式を作り直す方法が確実である. 少数のポーツのみを対象とする場合は,該当ポーツを個別に再ビルドする.root で次のコマンドを実行する.

cd /usr/ports/カテゴリ/ポーツ名
make clean
make CC=gcc14 CXX=g++14 CPP=cpp14
make deinstall reinstall
make clean

* インストール済みソフトウェアをすべて削除して入れ直す場合の操作は次の通り.root で実行する. pkg 自身も削除されるため,削除後に pkg bootstrap で再導入する. 設定ファイルは /usr/local/etc に残るが,事前にバックアップしておく.

pkg delete -fa
pkg bootstrap -f

GCC を用いたビルドで生じやすい問題と対処

ここでは,問題の例と対処法の例を示す. ここに示した対処法をやみくもに試してはいけない. まず,エラーメッセージの中身を確認し,それに応じた対処のみを実施すること.

C++ 標準ライブラリの不一致による未定義参照

◆ 問題の例

リンク時に undefined reference to `std::__1::...'undefined symbol: _ZNSt7__cxx1112basic_string... のようなエラーが出る.

(原因)基本システムの Clang は libc++ を,ポーツの GCC は libstdc++ を使用する. 一方でビルドされたライブラリを他方でビルドされたプログラムからリンクすると, C++ の名前修飾(マングリング)とライブラリ実装が一致せず,シンボルが解決できない.

◆ 対処法の例

C++ で書かれたライブラリとそれを使うプログラムを,同一のコンパイラでビルドし直す. GCC を使う必要がない場合は,基本システムの Clang でビルドする.root で次のコマンドを実行する.

cd /usr/ports/カテゴリ/ポーツ名
make clean
make CC=cc CXX=c++ CPP=cpp
make deinstall reinstall
make clean

実行時に共有ライブラリが見つからない

◆ 問題の例

実行時に Shared object "libstdc++.so.6" not foundShared object "libgfortran.so.5" not found のようなエラーが出る.

(原因)GCC の共有ライブラリは /usr/local/lib/gcc14 に置かれており, 実行ファイルにこのディレクトリの情報が埋め込まれていない.

◆ 対処法の例

rpath を指定してビルドし直す.root で次のコマンドを実行する.

cd /usr/ports/カテゴリ/ポーツ名
make clean
make CC=gcc14 CXX=g++14 CPP=cpp14 LDFLAGS+="-Wl,-rpath,/usr/local/lib/gcc14 -Wl,-rpath,/usr/local/lib"
make deinstall reinstall
make clean

◆ 依存する共有ライブラリの確認

ldd /usr/local/bin/実行ファイル名

共有ライブラリのビルドでの再配置エラー

◆ 問題の例

relocation R_X86_64_PC32 against symbol ... can not be used when making a shared object; recompile with -fPIC というエラーが出る.

(原因)共有ライブラリに組み込むオブジェクトファイルが位置独立コードとしてコンパイルされていない.

◆ 対処法の例

-fPIC を付けてビルドし直す.root で次のコマンドを実行する.

cd /usr/ports/カテゴリ/ポーツ名
make clean
make CC=gcc14 CXX=g++14 CPP=cpp14 CFLAGS+=-fPIC CXXFLAGS+=-fPIC
make deinstall reinstall
make clean

新しい GCC で厳格化された診断によるビルド失敗

◆ 問題の例

error: implicit declaration of functionerror: incompatible integer to pointer conversionerror: '...' was not declared in this scope のようなエラーが出る.

(原因)GCC 14 以降では,従来は警告であった古い C の記法の一部がエラーとして扱われる. また,C++ の標準ヘッダの間接的な取り込みが減っているため,必要なヘッダが取り込まれずにエラーになる場合がある.

◆ 対処法の例

上流で修正済みであることが多いため,まずポーツ・コレクションを更新し,新しいバージョンでビルドし直す. root で次のコマンドを実行する.

git -C /usr/ports pull
cd /usr/ports/カテゴリ/ポーツ名
make clean
make
make deinstall reinstall
make clean

更新しても解決しない場合は,そのポーツを基本システムの Clang でビルドする.root で次のコマンドを実行する.

cd /usr/ports/カテゴリ/ポーツ名
make clean
make CC=cc CXX=c++ CPP=cpp
make deinstall reinstall
make clean