Rustインストール後にlibrustc_driverが無いといわれる現象について

LinuxにRustをインストールした後、rustc(1)を実行しようとして、次のようなエラーメッセージが表示されることがある。

$ rustc 
rustc: error while loading shared libraries: librustc_driver-4e7c5e5c.so: cannot open shared object file: No such file or directory

手元のUbuntu 12.04 LTSにRust 1.0.0をインストールした際に発生。ただし、おそらく普通のUbuntuの環境に普通にRustをインストールした場合には発生しないはずだ。

この問題は、CensOSなどの一部のディストリビューションにRustをインストールした場合や、Rustのインストール時に--destdirや--prefixでインストール先を変更した場合に発生する。

解決方法は2つ。

  1. 環境変数LD_LIBRARY_PATHに、Rustの共有ライブラリがインストールされたディレクトリを追加する。
  2. /etc/ld.so.conf(もしくは/etc/ld.so.conf.d/直下の任意のファイル)にRustの共有ライブラリがインストールされたディレクトリを追加した後に、「sudo ldconfig」する。

Rustの共有ライブラリは、デフォルトでは/usr/local/libにインストールされる。当然ながら、インストール時に--destdirや--prefixを指定した場合は、その限りではない。

なんでこうなるの?

Rust 1.0.0の時点において、Rustのインストール・スクリプトは共有ライブラリを/usr/local/libにコピーした後、ldconfig(8)を実行する。*1

ここで、/etc/ld.so.confに/usr/local/libが含まれていれば、ldconfig(8)によって/usr/local/lib直下のRustの共有ライブラリがピックアップされ、/etc/ld.so.cacheに追加される。その後、rustc(1)実行時に/etc/ld.so.cacheの情報を元に共有ライブラリを探し、無事に発見できる。

CensOSでは/etc/ld.so.confに/usr/local/libが含まれていないため、ldconfig(8)を実行しても、/etc/ld.so.cacheに/usr/local/lib直下のRustの共有ライブラリの情報が追加されない。そのため、rustc(1)実行時に/etc/ld.so.cacheの情報を元に共有ライブラリを探しても発見できず、rustc(1)の実行に失敗する。

また、--destdirや--prefixでインストール先を変更した場合、インストール・スクリプトは別に/etc/ld.so.confに共有ライブラリのインストール先を追加するわけでもなんでもない。そのため、CentOSのケースと同様の現象が起こる。

ただし、--destdirや--prefixによって変更された共有ライブラリのインストール先が、/etc/ld.so.confに登録済みのディレクトリならばインストール時のldconfig(8)にて無事に共有ライブラリが/etc/ld.so.cacheに追加されるし、/libや/usr/libならばデフォルトの共有ライブラリ検索対象なので、この問題は発生しない。

おそらく、正攻法の対策は「/etc/ld.so.confに追記して『sudo ldconfig』」だろうが、勉強用に自分のアカウントで使う程度ならば、環境変数LD_LIBRARY_PATHに追記してしまうほうが楽だろう。

個人的には、デフォルトのインストール・パス(/usr/local)にインストールしてしまうのなら、インストール先がインストール先だけに/etc/ld.so.confに追記する方法を選ぶだろう。もっとも今回は--prefixを設定してホームディレクトリにインストールしたので、.bash_profileにてLD_LIBRARY_PATHに追加する方法を採用したのだった。

蛇足

なお、Ubuntuにてログイン時にLD_LIBRARY_PATHを設定したい場合は、.bash_profileや.profileではなく.bashrcに書くこと。

Bug #366728 “LD_LIBRARY_PATH not loading from .profile nor /etc/...” : Bugs : xorg package : Ubuntuのバグの影響で、.bash_profileや.profileに書いておいてもリセットされてしまうようだ。

*1:ldconfig(8)を実行する都合上、インストール・スクリプトはroot権限で実行する必要がある。