- ベストアンサー
gccでの共有ライブラリのver指定
表題の件に関して質問させていただきます。 たとえば/usr/libにある;libA.soをリンクしたい時、gccでは gcc -lA としますが、libA.so.1,libA.so.2‥と複数バージョンがある場合、バージョンまで指定してコンパイルすることは可能でしょうか? サーバー権限を持っていないので、シンボリックリンクを張り直すという手は使えません。 また、自分のアカウントで同共有ライブラリを用意したのですが、/usr/libが優先されてしまい、自分のアカウントのライブラリを設定することは出来ません。 解決法をご存知の方、ご教授お願い致します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
通常ライブラリをインストールすると 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 を指定できます。
その他の回答 (2)
- entree
- ベストアンサー率55% (405/735)
> ・自分のディレクトリにシンボリックリンクを作成 > ・後者の方法でディレクトリを指定してリンクさせる > という二段階を踏めばよろしいのでしょうか? その方法で大丈夫です。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 は必要ありません。
お礼
できました! このたびは本当にありがとうございました。
- Tacosan
- ベストアンサー率23% (3656/15482)
とりあえず後者だけ: -L
お礼
ありがとうございます。 -Lでライブラリの場所を指定すると直後のライブラリに反映されるのですね。 ためになりました。
お礼
大変参考になりました。ありがとうございます。 シンボリックリンクを作成したいディレクトリが管理者権限でないと編集できない場合は、 ・自分のディレクトリにシンボリックリンクを作成 ・後者の方法でディレクトリを指定してリンクさせる という二段階を踏めばよろしいのでしょうか?