重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

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

A 回答 (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 を指定できます。
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/02/02 17:38

> ・自分のディレクトリにシンボリックリンクを作成


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

その方法で大丈夫です。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 は必要ありません。
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/03/07 11:44

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

    • good
    • 0
この回答へのお礼

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

お礼日時:2010/02/01 21:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!