🐱

Ubuntu 24.04にしたら、C++コンパイルでエラー(‘uint8_t’ was not declared in this)になった件

2024/09/23に公開

先日、WSL環境をUbuntu 24.04にアップデートしたのですが、この環境でReactNativeのビルドを行ったところエラーが発生したのでその理由の共有になります。

ReactNativeのビルドでエラー

error: ‘uint8_t’ was not declared in this scope
note: ‘uint8_t’ is defined in header ‘<cstdint>; did you forget to ‘#include <cstdint>’?

この通り、uint8_tが宣言されていないというエラーが発生。
cstdintをインクルードしろと言われているので調べたところ、確かにuint8_tを利用するにはcstdintのインクルードが必要な模様。
ただし、このプロジェクトは元々ビルドが通っていたものなんですよね。
なのでもう少し調べてみたところ、このあたりのコンパイラ仕様がバージョンで変更になっているとの情報に辿り着きました。

Ubuntu 24.04のg++(gcc)はv13系

という訳で、エラーが発生しているのはC++のコンパイル部分なのでg++のバージョンを確認してみたところ、v13系に上がっていることが分かりました。

$ g++ --version
g++ (Ubuntu 13.2.0-23ubuntu4) 13.2.0
Copyright (C) 2023 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.

Ubuntu24.04のg++のデフォルトバージョン(apt installでインストールされる)はv13系のようです。

$ apt list g++
一覧表示... 完了
g++/noble,now 4:13.2.0-7ubuntu1 amd64 [インストール済み]

ちなみにUbuntu22.04の場合は、v11系でした。

$ apt list g++
一覧表示... 完了
g++/jammy 4:11.2.0-1ubuntu1 amd64
g++/jammy 4:11.2.0-1ubuntu1 i386

g++をv12系にすることでエラーは解消

というわけでg++のバージョンによる影響が怪しいのでダウングレードしてみました。
もちろんv11系でも良いのですが、v12系にしてみました。

g++-12のようにバージョン指定でインストールできます。
一旦g++をアンインストールしてから、g++ v12をインストールします。
※v13を残しつつ、v12をインストールして切り替えて利用したい方は次の項目をご覧ください。

$ sudo apt remove g++
$ sudo apt install g++-12
$ g++ --version
g++ (Ubuntu 12.3.0-17ubuntu1) 12.3.0
Copyright (C) 2022 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.

v12系になったところで再度ビルドを実施したところ、問題無くビルドが通りました!

g++ v13 v12を共存させて切り替える

先の内容では手っ取り早くv13をv12に入れ替えてしまいましたが、v13を残したいという方向けの内容になります。
update-alternativesを利用します。

まずは、v13、v12をインストールします。

$ sudo apt install g++
$ sudo apt install g++-12
$ g++
g++     g++-12  g++-13

g++-12g++-13とバージョン付きが共存している形になります。
ただし、g++はどちらかのバージョンのリンクになっているはずです。

これをupdate-alternativesで切り替えられるようにするので、下記のように登録します。

$ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-13 13
$ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-12 12

g++という設定で/usr/bin/g++に対してg++-13g++-12を候補として登録といった内容です。
こうすると、下記のように選択式で切り替えられるようになります。

$ sudo update-alternatives --config g++
alternative g++ (/usr/bin/g++ を提供) には 2 個の選択肢があります。

  選択肢    パス           優先度  状態
------------------------------------------------------------
  0            /usr/bin/g++-13   13        自動モード
* 1            /usr/bin/g++-12   12        手動モード
  2            /usr/bin/g++-13   13        手動モード

現在の選択 [*] を保持するには <Enter>、さもなければ選択肢の番号のキーを押してください:

以上!

Discussion