clangのコンパイルエラーへの対応: `ld.lld: error: cannot open crtbeginS.o: No such file or directory`

clangでC++のプログラムをコンパイルすると,リンク時に以下のエラーが出て困ってしまった。

ld.lld: error: cannot open crtbeginS.o: No such file or directory
ld.lld: error: cannot open crtendS.o: No such file or directory

調べたところ,「How to Use Clang without GCC on Linux」に情報があった。

crtbeginS.oはClangから実行されるリンカー (ld) に必要なオブジェクトファイルだ。しかし、これらのファイルをclangは持っておらず、gccが持っている。これが根本的な問題のようだ。

解決策を調べていると「Simple? Linking issue when cross-compiling for AArch64 on X86 – Beginners – LLVM Discussion Forums」を見つけた。

clangの-Bオプションでバイナリーとオブジェクトファイルの検索パスを指定できるので、これで回避できるようだ。locate crtbeginS.oで格納場所を探したところ,/usr/lib/gcc/x86_64-linux-gnu/9/crtbeginS.oに格納されていた。

したがって,clangのオプションに-B /usr/lib/gcc/x86_64-linux-gnu/9/を指定して解決した。

この-Bオプションについて知らなかったので,追加で調査した。

-BはGCCの互換用オプション (Clang command line argument reference — Clang 12 documentation) となっている。

GCCの場合,-Bオプションの他に,GCC_EXEC_PREFIX環境変数でも指定できるらしい (Directory Options (Using the GNU Compiler Collection (GCC)))。

ただし,この環境変数はGCC専用のようで、clangでは使えなかった。

業務中に見つけた問題で,いろんなところで報告されているものの決定的な対策がなかなか見つからなかった。ひとまず解決できたので,同じ問題に遭遇したらこの投稿を参考に迅速に対応したい。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です