Ubuntu 24.04にしたら、C++コンパイルでエラー(‘uint8_t’ was not declared in this)になった件
先日、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++-12
、g++-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++-13
、g++-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