ubuntu-latest(Ubuntu 26.04)の GCC 15 で通らなくなった C と C++ のビルド
ubuntu-latest は、2026年10月19日から11月19日にかけて Ubuntu 24.04 から 26.04 に移ります(ほかに変わること)。既定の gcc と g++ は GCC 13 から GCC 15 に上がります(24.04 のイメージは 13.3.0、26.04 のイメージは 15.2.0)。既定が GCC 14 を飛ばすので、2つのリリースぶんの変更が一度に来ます。昨日まで通ったコードが、make で、C の拡張を持つパッケージの pip install で、あるいは下で C をコンパイルする Rust や Go のビルドで落ちます。
どの変更か
ほとんどは3つの型のどれかです。ある型を直すフラグは、ほかの型には効かないので、まず最初のエラーを見ます。
1. C が既定で C23 になった(GCC 15)
GCC 15 は C を -std=gnu23 でコンパイルします。GCC 13 と 14 は -std=gnu17 でした(Porting to GCC 15)。C23 では空の引数の並び () は (void) の意味になり、bool・true・false・nullptr・thread_local はキーワードです。ubuntu-latest の HDF-EOS5(hdf5 #6841)と GCC の案内から:
error: too many arguments to function 'pakr2dm'; expected 0, have 1 error: passing argument 8 of 'inv_init' from incompatible pointer type [-Wincompatible-pointer-types] error: 'bool' cannot be defined via 'typedef'
わかりにくいのは、C の版で切り替わるマクロから来るものです。libmdbx は C23 では [[maybe_unused]] に展開され、「expected identifier or '(' before 'static'」で落ちます(lighthouse #10518)。
2. 警告がエラーになった(GCC 14)
GCC 14 は、古い6つの警告をエラーにしました。暗黙の関数宣言、暗黙の int、int-conversion、incompatible-pointer-types、return-mismatch、declaration-missing-parameter-type です(Porting to GCC 14):
error: implicit declaration of function 'strlen' [-Wimplicit-function-declaration]
pylzma 0.5.0(2018年)は pip install で「makes integer from pointer without a cast」で落ちます(hera #1140)。気づきにくいのは configure です。確かめ用のプログラムがコンパイルできなくなるので、入れたはずのライブラリが無いと判断します。hdf5 #6841 では「szlib is not functional」と出ました。
3. C++ のヘッダーがほかのヘッダー経由で入らなくなった(GCC 15)
libstdc++ のヘッダーどうしが互いを読み込む量が減り、よく引っかかるのは <cstdint> です(Porting to GCC 15):
error: 'uint64_t' does not name a type note: 'uint64_t' is defined in header '<cstdint>'; this is probably fixable by adding '#include <cstdint>'
自分のコードではなく、依存先にあることが多いです。直る前の版に固定した ITK(ITKR #79)や、Rust の rocksdb クレート 0.22.0 が cc-rs で組み立てる RocksDB 8.10.0 です。
型1の直し方:C を C17 でコンパイルする
本当の直し方は、関数に引数を書き、キーワードと重なる名前を変えることです。先にビルドを緑にするなら、前の既定を指定します:
env: CFLAGS: -g -O2 -std=gnu17
-g -O2 は残します。CFLAGS を決めると、configure が使うはずだった既定が置き換わるからです。Autotools・setuptools(つまりソースからの pip install)・Rust の cc クレートは CFLAGS を読みます。そのほか:
- CMake:
cmake -DCMAKE_C_STANDARD=17 ...で-std=gnu17になります。プロジェクトが自分で標準を決めている場合は別です。 - Meson:
meson setup -Dc_std=gnu17 ...。 - cgo を使う Go:
CGO_CFLAGS: -O2 -g -std=gnu17(既定の-O2 -gを置き換えます)。
lighthouse #10518 は、libmdbx の修正が入るまで slasher のテストをこの形で組み立てます。
型2の直し方:宣言を足す
note が示すヘッダーを読み込むか、関数を宣言します。自分のコードでなければ、まず新しいリリースを探します。pylzma には2026年1月から 0.6.0 と 0.6.1 があります。その場しのぎなら、-fpermissive で C のこれらのエラーを警告に戻せます。1つずつ戻すなら:
env: CFLAGS: -g -O2 -Wno-error=implicit-function-declaration -Wno-error=int-conversion
hdf5 は configure に -Wno-error=implicit-function-declaration を渡して、szlib の確かめを通るようにしました。CFLAGS をすべての段に渡さないビルドもあり、GCC 14 の案内はそういうときに CC="gcc -fpermissive" を勧めています。
型3の直し方:依存先を上げるか、include を足す
どの -std でもヘッダーは戻りません。include が抜けているライブラリを上げます。drasi は rocksdb クレートを 0.22.0 から 0.24.0 に上げ、RocksDB は 10.4.2 になりました(drasi-core #1000)。ITK は2025年6月にヘッダーを直しています。まだ上げられないなら、CXXFLAGS: -include cstdint ですべての C++ のファイルにそのヘッダーを足せます。
または 24.04 と同じ GCC を使う
26.04 のイメージにも gcc-13 と gcc-14 があります(g++-13 は 13.4.0、g++-14 は 14.3.0)。ビルドを GCC 13 に向ければ、3つの型のどれも起きません:
env: CC: gcc-13 CXX: g++-13
Autotools・CMake(新しいビルドディレクトリで)・setuptools・cc-rs・cgo は CC と CXX を読みます。もう1つの逃げ道は、そのジョブを runs-on: ubuntu-24.04 にすることで、GitHub が 24.04 のイメージを終えるまで使えます。どちらも時間を稼ぐだけで、次のコンパイラーのためにはコードを直す必要があります。
見分け方
- 「Set up job」の Runner Image の欄が
ubuntu-26.04かubuntu-24.04かを見ます。11月19日までは、再実行が 24.04 に当たって通ることがあるので、再実行が緑でも何も確かめたことになりません。 - ビルドの前に
gcc --versionのステップを置くと、26.04 では 15.2.0、24.04 では 13.3.0 と出ます。 - コンパイルはすべて通り、そのあとプログラムが「cannot open shared object file」で起動しないなら、コンパイラーではなくライブラリの版です:Ubuntu 26.04 の「cannot open shared object file」。
ほかの 26.04 の失敗
- Ubuntu 26.04 の setup-beam の「not found in version list」:26.04 向けの Erlang/OTP のビルドの一覧は OTP 26.0 からなので、OTP 24 と 25 はセットアップで止まり、v1.24.1 より古い setup-beam はどの OTP でも落ちます。
- Ubuntu 26.04 の setup-ruby の「Unavailable version」:26.04 向けには Ruby の各系列の一部のパッチしか作られていないので、
.ruby-versionの 3.4.2 のような固定は Ruby のステップで止まります。 - Ubuntu 26.04 の「cannot open shared object file」:libxml2 は
libxml2.so.16、ICU は 78 なので、24.04 で保存したキャッシュや 24.04 向けのバイナリがlibxml2.so.2やlibicudata.so.74を見つけられません。 - Ubuntu 26.04 の apt:名前が変わった・無くなったパッケージ。
- 「coreutils: unknown program」:基本のコマンドのほとんどが uutils です。
- Ubuntu 26.04 の「client version ... is too old」:Docker 29 は API 1.40 より古いクライアントを断るので、古い Testcontainers は「Could not find a valid Docker environment」で落ちます。
失敗したジョブを IntelliJ IDEA から見るなら
Pipeline Inbox for GitHub Actions Workflows は、Lesstep が作っている JetBrains IDE(2024.1 以降)のプラグインです。すべてのリポジトリの実行を、ジョブ・ステップと一緒に IDE のツールウィンドウに並べ、いまのブランチの実行はステータスバーに出ます。読むのは無料、失敗したジョブの再実行・キャンセル・ワークフローの実行・デプロイのレビューは Pro(月 US$1.50・30日の無料試用つき)です。
GitHub と GitHub Actions は GitHub, Inc. の商標、Ubuntu は Canonical Ltd. の商標、IntelliJ IDEA は JetBrains s.r.o. の商標です。このページは GitHub, Inc.・Canonical・GCC のプロジェクト・JetBrains のいずれとも提携しておらず、承認も受けていません。
ほかに:「The ubuntu-latest label will migrate to Ubuntu 26」 · Ubuntu 26.04 の「cannot open shared object file」 · Ubuntu 26.04 の setup-ruby の「Unavailable version」 · IntelliJ IDEA で使える GitHub Actions のプラグインの比較 · English