質問

一瞬、私は以下の質問から実験・ソートに自分自身を環境を持っていないので、謝罪ます:

libmylib_super.alibmylib_super.somylib_dumb.amylib_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.alibboost_date_time-mt-d.so.1.41.0libboost_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は、命名規則に従っていませんので。

を参照してください。 GNUリンカマニュアルのます:

  

-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を使用している場合。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top