gccでの共有ライブラリのver指定

解決済みの質問

gccでの共有ライブラリのver指定

表題の件に関して質問させていただきます。
たとえば/usr/libにある;libA.soをリンクしたい時、gccでは
gcc -lA
としますが、libA.so.1,libA.so.2‥と複数バージョンがある場合、バージョンまで指定してコンパイルすることは可能でしょうか?
サーバー権限を持っていないので、シンボリックリンクを張り直すという手は使えません。
また、自分のアカウントで同共有ライブラリを用意したのですが、/usr/libが優先されてしまい、自分のアカウントのライブラリを設定することは出来ません。
解決法をご存知の方、ご教授お願い致します。

投稿日時 - 2010-01-31 17:08:39

QNo.5638277

困ってます

質問者が選んだベストアンサー

通常ライブラリをインストールすると

libA.so (libA.so.1.0.2へのシンボリックリンク)
libA.so.1 (libA.so.1.0.2へのシンボリックリンク)
libA.so.1.0.2

という3つのファイルが存在すると思います。

libA.so.1.0.2はライブラリの実体、libA.so.1 は実行時に参照される
ライブラリ、libA.soはコンパイル時に指定されるライブラリです。

もし、さらにlibA.so.2.0.2が存在する場合、
こんな感じになっていると思います。

libA.so (libA.so.1.0.2へのシンボリックリンク)
libA.so.1 (libA.so.1.0.2へのシンボリックリンク)
libA.so.1.0.2
libA.so.2 (libA.so.2.0.2へのシンボリックリンク)
libA.so.2.0.2

この状態で gcc -lAとすると、その実体は libA.so.1.0.2で、そこに書かれて
いるsoname (ライブラリにハードコードされています) によって実行時に
はlibA.so.1を見るようになります。

そこで、libA.soのリンク先を libA.so.2.0.2 に変更してあげます。
# ln -sf libA.so.2.0.2 /usr/lib/libA.so
そして、gcc -lAとすると実体は libA.so.2.0.2なので、実行時にlibA.so.2
を見るようにすることができます。

もし、libA.so.1とlibA.so.2が別のディレクトリにインストールされている場合
は先に検索したいディレクトリを -L オプションで指定すればよいです。

libA.so.1 が /opt/lib1/lib、libA.so.2 が /opt/lib2/libに存在する場合、

gcc -L/opt/lib2/lib -lA -Wl,-rpath,/opt/lib2/lib

で libA.so.2 を、

gcc -L/opt/lib1/lib -lA -Wl,-rpath,/opt/lib1/lib

で libA.so.1 を指定できます。

投稿日時 - 2010-02-01 22:36:46

お礼

大変参考になりました。ありがとうございます。
シンボリックリンクを作成したいディレクトリが管理者権限でないと編集できない場合は、
・自分のディレクトリにシンボリックリンクを作成
・後者の方法でディレクトリを指定してリンクさせる
という二段階を踏めばよろしいのでしょうか?

投稿日時 - 2010-02-02 17:38:12

ANo.2

3人が「このQ&Aが役に立った」と投票しています

[  前へ  |  次へ ]

ベストアンサー以外の回答(2件中 1~2件目)

ANo.3

> ・自分のディレクトリにシンボリックリンクを作成
> ・後者の方法でディレクトリを指定してリンクさせる
> という二段階を踏めばよろしいのでしょうか?

その方法で大丈夫です。libA.soのシンボリックリンクを
/home/hogehoge/libに作成するとすれば、

ln -s /opt/lib1/lib/libA.so.1.0.2 /home/hogehoge/lib/libA.so
gcc -L/home/hogehoge/lib -lA -Wl,-rpath,/opt/lib1/lib

ln -s /opt/lib2/lib/libA.so.2.0.2 /home/hogehoge/lib/libA.so
gcc -L/home/hogehoge/lib -lA -Wl,-rpath,/opt/lib2/lib

とすることで異なるバージョンのライブラリとリンクできると思います。
rpathは実行時パスなので /home/hogehoge/lib とはせず、
実行時に参照されるライブラリが存在するlibA.so.1 もしくは
libA.so.2 が存在するディレクトリを指定します。
もし、libA.so.1 もしくは libA.so.2 が /lib もしくは /usr/lib
に存在する場合、rpath は必要ありません。

投稿日時 - 2010-02-02 21:10:21

お礼

できました!
このたびは本当にありがとうございました。

投稿日時 - 2010-03-07 11:44:22

ANo.1

とりあえず後者だけ: -L

投稿日時 - 2010-01-31 23:17:44

お礼

ありがとうございます。
-Lでライブラリの場所を指定すると直後のライブラリに反映されるのですね。
ためになりました。

投稿日時 - 2010-02-01 21:42:33

あわせてチェックしたい
  • gccのコンパイルについて ...
  • gccの「-l」オプションとライブラリの関係 ...
  • シンボリックリンクの検索 ...
PR
【回答募集中】花粉にひと言、物申す![ 詳細 ]

OKWaveのオススメ

教えて弁護士さん!

お金の悩みQ&A特集はこちら