cmakeがビルドできねえ!どいつが悪いんだ?→お前

ちゃんとログ読もうね〜という話


ここ数日dev-util/cmake::gentooのアプデ(3.23.3)が降ってきているにも関わらずビルドがコケてアプデできていませんでした。

自分自身は別に(間接的にしか)使ってないんですが、あまり気分がいい状態ではないのでなんとな〜く調査しつつもめんどくさそうだな〜と思って手を出さずにいました。 ちなみに同じくGentooを使っている知人は普通に入っているらしい(そっちはsystemdがビルドできないらしい。私は普通にできてますが)。

んで今日やるか〜となったのでそのログ。

調査

まずはログを読む。

実はこの画像に答えが書いてある

jsoncppのシンボルが見つからんとか言ってる気がするので、jsoncppのバージョンとかをチェックするが、問題はなさそうな雰囲気。

じゃあ指定されてるメソッドとかがないのでは……と確認してみるが、普通にある。

じゃあコンパイルオプションがおかしいのか……?となり、ちゃんと見てみることに。

cd /var/tmp/portage/dev-util/cmake-3.23.3/work/cmake-3.23.3_build/Source && /usr/bin/cmake -E cmake_link_script CMakeFiles/ctest.dir/link.txt --verbose=1
/usr/lib/ccache/bin/x86_64-pc-linux-gnu-g++ -02 -pipe -Wl,-01 -Wl,--as-needed CMakeFiles/ctest.dir/ctest.cxx.o -o ../bin/ctest -Wl,-rpath,/usr/local/lib libcTestLib.a libСMakeLib.a kwsys/libcmsys.a -ldl ../Utilities/std/libcmstd.a /usr/ lib64/libexpat.so -lz /usr/lib64/libarchive.so /usr/local/lib/libjsoncpp.so /usr/lib64/libuv.so /usr/lib64/librhash.So /usr/lib64/libcurl.so 

1行目はcdしてcmake起動してるだけなので無視。 2行目はctest.cxx.oコンパイルして../bin/ctestを出力していて、あといろいろオプションつけてて……、

と読んでて、これオプションの順番おかしいせいでUndefinedとか言ってるのでは?とか思ったけど、これで合ってるらしい(むしろ依存されてる方が後ろに来るらしいですね。gccまともに触ったことないので知らなかった)。

bfin.sakura.ne.jp

んでもうちょっとちゃんと読んでると、件のjsoncppだけパスがなんかおかしいことに気付く。

お前だけなんかおかしくね?

なんか/usr/local/lib/libjsoncpp.soが参照されている(参照してほしいのは/usr/lib64/libjsoncpp.soである)。 ちなみに/usr/lib64/より/usr/local/lib/の優先順位が高いのは/etc/ld.so.confでそうなってるから。

こんなん置いた覚えないぞ……?とか思いながらこいつが何者なのかを見てみると、

最近もはやあんまり使ってないアプリであるToggl Trackのデスクトップ版をGNU Stowを使ってリンクしたものだった。

Stowは結構いいと思いますよ(というか今回の話について言えばStowは関係ない)

対処

ということで原因は

  1. /usr/local/
  2. Toggl Trackをインストールしていること
  3. さらに、/usr/local/lib//usr/lib64/より優先順位が高くなっていること

の3つが揃ったせいだった。

一番手っ取り早いのはToggl Trackを消すことだけど、根本的な解決かというと怪しいし、使ってないけど消すのは負けた気もする……ということで選択肢

  • 1.を解決する
    /usr/local/にインストールしなければいい。どうせ自分しか使わないので~/.localとかに。
  • 2.を解決する
    前述の通りなんか負けた気がするので却下。
  • 3.を解決する
    すなわち、/etc/ld.so.confを書き換える。
    なんか問題が起きそうだし、/usr/local/libの方が優先順位が高いのは「デフォだと問題があるので自分で差し替えました」みたいなユースケースがある(やったことはない)と思うと違うかもなあということで却下。

ということで1.の解決を選択。

~/.localにstowのディレクトリを作ってインスコ

これでcmakeがビルドできるようになった……はず。

できた

めでたし。


ちなみに cmake jsoncpp failed とかでggるとcmakeでjsoncppをビルドする時に失敗した話ばっかりでてきた。