
表題の件に関して質問させていただきます。
たとえば/usr/libにある;libA.soをリンクしたい時、gccでは
gcc -lA
としますが、libA.so.1,libA.so.2‥と複数バージョンがある場合、バージョンまで指定してコンパイルすることは可能でしょうか?
サーバー権限を持っていないので、シンボリックリンクを張り直すという手は使えません。
また、自分のアカウントで同共有ライブラリを用意したのですが、/usr/libが優先されてしまい、自分のアカウントのライブラリを設定することは出来ません。
解決法をご存知の方、ご教授お願い致します。
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 を指定できます。
大変参考になりました。ありがとうございます。
シンボリックリンクを作成したいディレクトリが管理者権限でないと編集できない場合は、
・自分のディレクトリにシンボリックリンクを作成
・後者の方法でディレクトリを指定してリンクさせる
という二段階を踏めばよろしいのでしょうか?
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 は必要ありません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
#pragma commentの相対パス指定
-
lvwReport/エラー/プロジェクト...
-
ライブラリについて
-
visual studio community2017 O...
-
BorlandC++Builder5.0でリンカ...
-
OpenSSLの共有ライブラリ(libcr...
-
スタティックライブラリ関係の...
-
静的/動的リンクライブラリにつ...
-
Visual C++ POSIX Thread
-
スタティックライブラリの使い方
-
Radiusのmake時に表示されるエ...
-
DirextXエラー:ファイル'dxerr9...
-
fatal error LNK1104: ファイル...
-
【VS2008 C++】2つのプロジェ...
-
MinGWでOpenMPを使いたいのです...
-
python エラー
-
エクセルのエラーメッセージ「4...
-
<unistd.h>をVisualStudioでつ...
-
” OS ビルド ” の意味が分か...
-
fortranでプログラムを実行する...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
スタティックライブラリの使い方
-
スタティックライブラリ関係の...
-
fatal error LNK1104: ファイル...
-
【VS2008 C++】2つのプロジェ...
-
インポートライブラリ(.lib)フ...
-
VS2010にて、依存関係とビルド順
-
VC++でビルド時の、リンク警告 ...
-
'd3dx9.lib' が開けません。
-
C++Builder リンカエラーとは?
-
visual studio community2017 O...
-
静的/動的リンクライブラリにつ...
-
スタティックリンクライブラリ...
-
exeファイルはどのdllを参照す...
-
ターボCのライブラリ追加方法
-
MinGWでOpenMPを使いたいのです...
-
VC++6.0からVC++.NET2005へ移植
-
ライブラリのリンクについて
-
VB6/SPREAD6.0 について
-
「MFCを使用しない」から「MFC...
-
error LNK2019: 未解決の外部シ...
おすすめ情報