11 困った g++ が動かない (解決した??)

(しばらく工事中)

Apple Silicon を搭載した Mac で
% cat test.cpp
#include <iostream>

int main(void)
{
  std::cout << "Hello" << std::endl;
  return 0;
}
% c++ test.cpp
% ./a.out
Hello
何気ないプログラム。当然(macOS 純正の c++ で) 動く。ところが
% which g++
/opt/local/bin/g++
% g++ test.cpp
MacPorts でインストールした g++ では怒涛のエラーが出力される。 エラーのほとんどが
SDKs/MacOSX.sdk/usr/include/mach/arm/_structs.h:633:26: error: '_Alignof' was not declared in this scope
(ちなみに Intel Mac ではこの症状は出ない。)


このことは認識されているようだが、 簡単に直らないのだか、 しばらく静観様子見状態(もう1ヶ月以上?)になっているみたい。

まあ今のところ macOS 純正の c++ でしのげるので、何とかなっているのだけど、 困った。 Homebrew の方は大丈夫というか、対処したようなんだけど (https://github.com/Homebrew/homebrew-core/issues/219174)。


対症療法として、各 C++ プログラムの中に次を書いておくこと。
#define _Alignof alignof
あるいは
alias	g++='g++ -D_Alignof=alignof'
いずれにせよ情けないなあ。

ここら辺で、猫の手でも借りたいときの (ちょっと違うな) ChatGPT 頼み。 ああやってみて、こうやってみて、に従っておりた診断が、

あなたの gcc14 インストールは、 +stdlib_flag variant によって libc++ のヘッダーを使用するよう 強制されている GCC です。
??ほんまかいな…ホントだ、そうなっている。 一度何かのはずみで variant 有効にすると、それがずっと残るから、 そういうせいかもな。

もし原因が本当にそれならば、次で直るはず… というのに小一時間つきあったけれど、解決せず。 give up することに。

どういうエラーが出てもへこたれずに何か提案してくるのには感心するけれど、 エラーログもきちんと読めないし(エラーはおこってませんとか言うので、 第x行のこれはエラーじゃないんですか?そうですね。深くお詫びします、 とか)。


それにしても、GCC は重要だと思うのだけど、 MacPorts にはちゃんとメンテナンスする人がいないのだろうか? (Homebrew に鞍替えしようかしら) それとも Apple Silicon 用の SDK って、本当に対処しにくい相手なのか。


(2025/5/22晩) https://trac.macports.org/ticket/72512

少し動きがあったようだけど…

(2025/5/30) Xcode と Command Line Tools for Xcode の Upgrade が来た (前者は 16.4, 後者は 15.5)。 upgrade したら、g++ のエラーが出ないようになった。 MacPorts の gcc14 の更新はまだ来ていないが、 これで alias g++='g++ -D_Alignof=alignof' とはさようなら。 とりあえず解決、でいいのかな。

(とりあえず、Command Line Tools ... の方だけでも更新すると、 /Library/Developer/CommandLineTools/SDKs/ に、 MacOSX15.5.sdk というディレクトリィが出来て、 /Library/Developer/CommandLineTools/SDKs/MacOSX15.sdk がそれへのシンボリック・リンクになる。その状態で g++ のエラーがでなくなる。 Xcode 自体は必ずしも更新する必要はないみたい。まあ、更新するけど。)

ネットでこの問題について議論している中に、 これは本来 Xcode の問題である、 あわてて対処するのはどうか、みたいなことを言う人がいたけれど、 それが正しかったのかしら。 GCC も 14.3 とか出たようだし、そのうち gcc14 もそれに置き換わるのか。

色々検索していて、GCC version 15 がリリースされた話も出ていた。 MacPorts にも近いうちに gcc15 が来るのか。 (C++でなく) C に体も割と大きな変更があるようで、 また「○○がコンパイル出来なくなった!」とか起こるのかな。 C++ とは違って、Cについては、満を持して、というところがあるので、 しっかり迎えようと思っている。



桂田 祐史