2016/01/05

LD_LIBRARY_PATH を設定しても反映されないことがある

@ Ubuntu 14.04 LTS

システム全体でライブラリパスを指定したかったので、/etc/environment に以下を追記したのですが反映されませんでした他の環境変数は反映されているのに

/etc/environment
LD_LIBRARY_PATH=/usr/local/hoge/lib

LD_LIBRARY_PATH の設定が反映されないファイルがある

調べてみると、大分前からそういう仕様だそうです知らなかった…
システムワイドに LD_LIBRARY_PATH を指定することってあまり無いからなー


LD_LIBRARY_PATH についての説明から抜粋

Note: You can only set this environment variable inside an interactive shell. Since Ubuntu 9.04 Jaunty Jackalope, LD_LIBRARY_PATH cannot be set in $HOME/.profile, /etc/profile, nor /etc/environment files. You must use /etc/ld.so.conf.d/*.conf configuration files. See Launchpad bug #366728 for more information.

(意訳)
この環境変数はインタラクティブシェルの中でのみ設定できます。Ubuntu 9.04 以降では、LD_LIBRARY_PATH を $HOME/.profile, /etc/profile, /etc/environment の中で設定することは出来ません。 /etc/ld.so.conf.d/*.conf の中で設定する必要があります。さらに詳しい情報は Launchpad bug #366728 を参照してください。


というわけで、以下のファイルに LD_LIBRARY_PATH を記述しても反映されません。
  • $HOME/.profile
  • /etc/profile
  • /etc/environment

解決方法1: システム全体で使いたい場合

/etc/ld.so.conf.d 以下に新たなファイルを作り、各行にライブラリパスを追加します。

/etc/ld.so.conf.d/hoge.conf
# コメントも書けます
/usr/local/hoge/lib
/usr/local/hoge/share/lib

/etc/ld.so.cache を再構築するため、以下を実行します。

$ sudo ldconfig

ビルドしてみると、リンクが通るはずです。
ただ、この状態で LD_LIBRARY_PATH 環境変数を見てみても、先ほどのパスは追加されていません。
その代わり、以下のようにリンクされるライブラリのリストを取得することができます。

$ ldconfig -p
1418 libs found in cache `/etc/ld.so.cache'
        libzinnia.so.0 (libc6,x86-64) => /usr/lib/libzinnia.so.0
        libzephyr.so.4 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libzephyr.so.4
        libzeitgeist-2.0.so.0 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libzeitgeist-2.0.so.0
        libzeitgeist-1.0.so.1 (libc6,x86-64) => /usr/lib/libzeitgeist-1.0.so.1
        libz.so.1 (libc6,x86-64) => /lib/x86_64-linux-gnu/libz.so.1
        libz.so.1 (libc6) => /usr/lib32/libz.so.1
...

解決方法2: 特定ユーザの設定ファイルに記述する

特定のユーザだけが使いたいのであれば、 $HOME/.bashrc 等、インタラクティブシェルにのみ反映されるようなファイルに記述すればオーケーです。

0 件のコメント: