スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

UbuntuのLD_LIBRARY_PATH

自分で開発したライブラリをホームディレクトリ以下の特定のディレクトリ(例えば~/lib)に置いて、他の(やはり自分で書いている)プログラムからリンクするということは、ソフトウェアを書いていればごく普通にあることだろう。

これを実現するには、環境変数LD_LIBRARY_PATHを設定すればよい…と思いきや、なにやらUbuntuを使っていると、個人ユーザレベルでは設定できないのである。.bash_profile、.profile、.xprofile、どこに記述しても無視されて、ログイン後はLD_LIBRARY_PATHは空白になってしまう。PATHなどの、他の環境変数は問題なく設定できるので、LD_LIBRARY_PATH固有の問題である。

いや、もちろん/etc/ld.so.conf.d以下のファイルで設定するとか、/etc/profileで設定するとかすれば一応設定はできる。しかしそれは、システムワイド、全ユーザ共通の設定になってしまう。全ユーザがある個人ユーザの個人ライブラリをリンクしに来る(しかも知らずに)というのは、明らかに正しい設定ではない。

調べて見たところ、一応バグとして報告されているようなのだが、原因はグラフィカルログインの後、すべてのプロセスがssh-agentなるものの子プロセスとして再設定され、ssh-agentが「セキュリティ上の配慮で」LD_LIBRARY_PATHの設定を空白で強制的に上書きするために、個人ユーザレベルの設定が無効化されてしまう、ということらしい。

セキュリティも結構であるが、*nix的にこんなに基本的な個人設定をぶち壊しにしてくれるとは、大きなお世話としか言いようがない。

対処法としては、/etc/X11/Xsession.optionsを編集し、
use-ssh-agent
の行を
no-use-ssh-agent
とすれば良いらしい。

ふー、これで一安心。

出典:LD_LIBRARY_PATH not loading from .profile nor /etc/environment
スポンサーサイト

CUDA Toolkitとgccのバージョン

FedoraからUbuntuに乗り換え中で、若干戸惑うこともある。

CUDA Toolkit 4.1.12(RC版)が出たのでインストールしたのだが、nvccを起動してみると、"gcc 4.6以降には対応してないよ!"というメッセージが出て使用できない。CUDA Toolkit 4.0ではもっとひどく、gcc 4.5以降非対応である。

Ubuntuのgccは、2011年12月7日現在で4.6.1。仕方あるまい、gcc 4.5にダウングレードするか…と思いきや、一方でCUDAを使うのに必須なもう一つの要素、NVIDIAのディスプレイドライバ(nvidia-current)の方は、モジュールコンパイルのためにgcc 4.6を要求してくる。おいおい…

結局、gcc 4.6と4.5を両方インストールし、/usr/bin/gccと/usr/bin/g++はそれぞれgcc-4.5、g++-4.5へのシンボリックリンクにして当面対応することにした。スマートじゃないな!

Makefileと暗黙のルール

GNU make + gcc/g++でプログラムをコンパイルする際、-lm とか -lOpenCL とかの追加ライブラリの 指定を、自分で書いたソースやオブジェクトよりもコマンドラインの後ろに書かないとリンクしてくれないことがある。

これは、gcc/g++はコマンドラインで指定されたオブジェクトファイルを前から順に見ていき、前のファイルに出てきた未解決参照を後ろのファイルで解決する、という動作になっているためだ。

リンカオプションだから、Makeの組み込み変数ではLDFLAGSに-lOpenCLと入れればいいかと思ったら、GNU makeの暗黙のルールではLDFLAGSはオブジェクトファイルの指定より前に来るようなので、上記の理由によりリンクエラーになってしまう。

GNU makeのマニュアルwww.gnu.org/s/make/manual/make.html#Catalogue-of-Rulesによれば、LDLIBSという組み込み変数はコマンドラインの一番後ろ("-o 出力ファイル" の直前)に挿入されるようなので、どうやらこの変数を使えばうまくいくようだ。

結局、なるべく暗黙のルールを効率的に使用するには、g++を使用する場合、

CPPFLAGS = -I$(HOME)/include -I/usr/local/cuda/include
CXXFLAGS = -g
LDFLAGS  = -L$(HOME)/lib -L/usr/local/cuda/lib64
LDLIBS   = -lmyCLManager -lOpenCL
TARGET = test1

all: $(TARGET)

$(TARGET): test1.cpp sub1.cpp sub2.cpp

のようにしておけば、オブジェクトや実行ファイル生成のルールは暗黙のルールをそのまま使用して簡潔に書けることがわかった。gccの場合はCXXFLAGSの代わりにCFLAGSを使えば良い。

プロフィール

GM3D

Author:GM3D
FC2ブログへようこそ!

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
FC2カウンター
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。