ライブラリの扱い
動的リンク
ライブラリを利用してプログラムを組んだ際に、プログラムの中に直接ライブラリのコードを含めるのではなく、ライブラリ内のどのファイルのどの関数を使っているなどを記述するのみにとどまるもの。
そのため、プログラム実行時になって初めて呼び出される。
ダイナミックリンクライブラリ(DLL)とも呼ばれ、windowsのアプリでは「.dll」でよく見られる。
プログラム自体にコードを含めないために、プログラムの容量を小さくすることができる。
UNIXでは拡張子が「.so」のものがこれにあたる。
静的リンク
動的リンクとは逆に、プログラム内にライブラリをすべて組み入れてしまっていること。
ライブラリを組み入れてしまっているので、APIなどの互換性を気にする必要がない。
が、プログラム内にライブラリを含んでいるので、容量は大きくなる。また、共有ライブラリに変更があった場合には、プログラム内のライブラリを個々に更新する必要がある。
UNIXでは拡張子が「.a」で始まるものがこれにあたる。
実行したいプログラムの参照ライブラリを参照する
% ldd main
main:
libtest.so => not found (0x0)
libc.so.6 => /lib/libc.so.6 (0x2807b000)
環境変数LD_LIBRARY_PATHを一時的に使えばいいかも?
標準ディレクトリ以外のライブラリを使用する
標準ディレクトリ以外にあるライブラリを使用することを考えるとき、2つの方法があるらしい。
- 環境変数LD_LIBRARY_PATHに使用するライブラリのパスを指定する
- /etc/ld.so.confに使用するライブラリのパスを追加し、ldconfigを行う。
普通は後者を用い、前者はデバッグ等で使用するのが適切らしい。
この理由はいろいろ書かれていたがこんな感じ。
- LD_LIBRARY_PATHはユーザー毎にいちいち設定しなければならない(面倒くさい)
- LD_LIBRARY_PATHは一時的なものであり、標準で指定されているものではないため、何かエラーやバグが発生することがある。
両方なんとなくわかるが、つまり、一つ目に関しては「みんな使うんやったら、最初から標準に入れとけ」ってこと。二つ目については、ライブラリを呼び出す順序に大きな関係がある。LD_LIBRARY_PATHが指定されてしまうと、こちらのパスを先に検索する。それから標準のほうを検索するために同じものが存在していたりなんかするとややこしいことが起こるというわけなようで。詳しくは…知らんw
オレ個人としては、LD_LIBRARY_PATHがどうなるもんなんか今ひとつわかってないのでもう少し調べてから掲載することにする。
わからんことは以下。ひとつ目は多分大丈夫やと思うけど…。
- LD_LIBRARY_PATHはユーザーごとにのみ設定されるのか?(すべてのユーザーに反映されない?)
- LD_LIBRARY_PATHはプログラム実行後や、ログアウト後に初期化されるのか?
2つ目に関してもおそらく初期化はされないのだろうが、ならば消す方法も見つけなくては。
(2009/5/24追記)
(参考URL:gccを用いた共有ライブラリの作り方)を参考にして、以上2つではないもうひとつのライブラリの使い方を知りました(思い出しました)。
使い方自体はスカラーのマニュアル(PGI_softek_ug;p38-40)に載ってます。
main.cをコンパイル。必要なライブラリはlibA.soとlibB.soであると仮定。
コマンド:
gcc main.c -o main libA.so libB.so
つまり、参照して欲しいライブラリはコマンドライン上でしていすればよい。
しかし、これは以前octaveをスパコン上で動作させようとした時にはうまくいかなかった。
問題点はいくつか考えられる。
- 指定しているパスがおかしい
- octave以外のライブラリが必要
- ソースファイルがおかしい
実際、上記の(gccを用いた共有ライブラリの作り方)を参考にして適当に作ったライブラリとソースのプログラムはすぐにローカルでは動いた。
が、スパコン上ではすこしずつおかしい所があったらしく動かなかった。現在は問題を解決し、動作する。
違いを見るためにもソースを張り付けてみる。参考にしてほしい。
新たなライブラリをライブラリの検索対象に追加する
上記のライブラリ追加の後者のやり方。
・/etc/ld.so.confを編集(viなどでokなはず…)
このファイルにはライブラリの検索対象となるディレクトリが列挙してあるだけなので、その中に検索してほしいディレクトリのパスを追加すればよい。
実際にはこんな感じ。
/usr/X11R6/lib
/usr/lib
usr/i486-linux-libc5/lib
/usr/local/lib
この一番下の行にでも追加すればOK。ただし、Linuxのバージョンなどによって記述方法は違う可能性があるので、それにあわせた編集を。
・ldconfigを実行し、設定を反映させる
実際にライブラリ検索の対象とさせるには、この操作が欠かせない。ファイル記述の段階では実際の検索命令を作成できているわけではない。
実際の検索対象のリストは/etc/ld.so.cacheになる。ldconfigを実行することで、このファイルが生成される。
このファイルのリストは/etc/ld.so.confで指定したパスの順序つきリストとなっている。
最後に動作確認をする。これは実際にコンパイルしてもいいが、ライブラリがリンクしているかどうかを確認するならあまり使い勝手がいいとはいえない。これは先に書いた、lddコマンドを使う。使い方は上記、または参考URLを参照のこと。
新たなライブラリをライブラリの検索対象に追加する2
こちらのやり方が、世間一般であまりオススメされていないらしい方法。
・パスの設定
LD_LIBRARY_PATH={ライブラリのパス}
という風に指定する。実際の例は以下。
LD_LIBRARY_PATH=/usr/local/pgsql/lib
・「export LD_LIBRARY_PATH」を実行
これによって設定が反映されるみたいです。
この環境変数の設定も、プラットフォームによって設定法が多少違う可能性があります。
詳しくは、参考URLを参照のこと。
「これやれよ」ってな感じだったり、「あんまり使うんじゃねぇ」みたいに書いてあるところもあったりで、賛否両論。
結局は「適度に、うまく使え」ってことなのね。
しかし、今回のスパコンでのライブラリの使用ということであると、スパコンのroot権限を持っていないことで、1つ目のような編集権限のないファイルを扱うような設定方法は現実的ではないどころではなく、不可能である。
そのため、スパコン上で標準以外のライブラリを使用することを考えるとこの方法しかないようだが、果たして…。
参考URL
#bf
Today's Access -
Yesterday's Access -
最終更新:2009年06月14日 23:55