質問
一瞬、私は以下の質問から実験・ソートに自分自身を環境を持っていないので、謝罪ます:
libmylib_super.a
とlibmylib_super.so
、mylib_dumb.a
とmylib_dumb.so
:1)のは、私は4つのライブラリファイルがあるとしましょう。リンクするライブラリを指定しますが、以下の違いは何アプローチです:
A)-l:libmylib_super.a
B)-llibmylib_super
C)-lmylib_super
D)-lmylib_dumb
2)のmanページから-static
の定義:
その支援の動的システムでは、この防止は、とのリンク、リンク 共有ライブラリ。他には システムは、このオプションは効果がありません。
このリンカオプションは、質問#1とは何かを持っていますか?それとも...万が一、彼らは互いに干渉のでしょうか?
感謝します。
---
--- 2009年12月28日を編集しました私はちょうど私の環境を持って、DATE_TIMEライブラリを後押しするためにリンクすることにより、ビットを実験します。私は3つのライブラリファイルを持っていると言う:。libboost_date_time-mt-d.a
、libboost_date_time-mt-d.so.1.41.0
、libboost_date_time-mt-d.so -> libboost_date_time-mt-d.so.1.41.0
(SYMリンク)
A.1)-l:libboost_date_time-mt-d.a
==>でも、ライブラリファイルがなくてもOK、バイナリ作品を結ぶ。
A.2)-l:libboost_date_time-mt-d.a
と-static
==>の の/usr/bin/ld: cannot find -lm
C.1)-lboost_date_time-mt-d
==>リンクOK、バイナリ動作しますが、共有ライブラリファイルが必要です。
C.2)-lboost_date_time-mt-d
と-static
==> のエラーをリンクする /usr/bin/ld: cannot find -lm
A.2及びC.2でのエラーに関する任意のアイデア?
C.1でプログラムを実行中にまた、それは名前libboost_date_time-mt-d.so.1.41.0
なくlibboost_date_time-mt-d.so
と共有ライブラリファイルを検索するようです。プログラムは、ライブラリの正確なバージョンせずにシステム上で実行されている場合には不便ではないこと?何が共有ライブラリを使用しているバージョンを処理するための実用的な方法だろうか?
解決
マニュアルによると、
A)は、正確にlibmylib_super.a
(共有ライブラリの行動のための最初の検索が適用されません)
B)はliblibmylib_super.so
が使用されている場合liblibmylib_super.a
という名前のファイルを検索しliblibmylib_super.a
かだけにして最初の-static
という名前のファイルをライブラリパスを検索 - ノートそれはlib
プレフィックスとファイル拡張子
C)は、ファイル命名libmylib_super.so
ためのライブラリパスを検索まずlibmylib_super.a
又はファイル命名liblibmylib_super.so
に対してのみ検索-static
を使用する場合
D)を参照C)
注B)が動作しないということは、ライブラリ名にlib
プレフィックスを追加する必要がありますリンカだから。
注D)が動作しないことを、あなたのmylib_dumb
は、命名規則に従っていませんので。
-l namespec
- ライブラリ= namespec
リンクへのファイルのリストにnamespecによって指定されたアーカイブファイルまたはオブジェクトファイルを追加します。このオプションは何回でも使用することができます。 namespecの形式である場合:ファイル名、ldはそれ以外の場合はlibnamespec.aと呼ばれるファイル用のライブラリパスを検索します、filenameというファイルのライブラリパスを検索します。
。共有ライブラリをサポートしているシステムでは、ldはまたlibnamespec.a以外のファイルを検索することができます。具体的には、ELFとSunOSシステムでは、ldは1と呼ばれるlibnamespec.aを検索する前に、libnamespec.soと呼ばれるライブラリのディレクトリを検索します。 (慣例により、拡張子.so共有ライブラリを示します。)(注)この動作はには適用されないこと:常にfilenameというファイルを指定し、ファイル名、
リンカは、それがコマンドラインで指定された場所で、一度だけアーカイブを検索します。アーカイブは、コマンドライン上のアーカイブの前に現れ、いくつかのオブジェクトで未定義たシンボルを定義する場合、リンカーは、アーカイブからの適切なファイル(単数または複数)を含むであろう。ただし、コマンドラインで、後に登場するオブジェクトに未定義のシンボルは、リンカが再びアーカイブを検索することはありません。
を参照してください - 。アーカイブを複数回検索するようにリンカーを強制する方法について(オプション
あなたはコマンドラインで同じアーカイブを複数回表示されることがあります。
アーカイブ検索のこのタイプは、Unixのリンカーのための規格です。ただし、AIX、それはAIXリンカーの振る舞いは異なることに注意してください上のLDを使用している場合。