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つ。
- 環境変数LD_LIBRARY_PATHに、Rustの共有ライブラリがインストールされたディレクトリを追加する。
- /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に書いておいてもリセットされてしまうようだ。