• ベストアンサー

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

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

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

  • ベストアンサー
  • entree
  • ベストアンサー率55% (405/735)
回答No.2

通常ライブラリをインストールすると 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 を指定できます。

runjump
質問者

お礼

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

その他の回答 (2)

  • entree
  • ベストアンサー率55% (405/735)
回答No.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 は必要ありません。

runjump
質問者

お礼

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

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

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

runjump
質問者

お礼

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

関連するQ&A