2016-06-27 5 views
0

-l:/path/to/libraryldのプログラムをコンパイルしようとしていますが、1台のコンピュータではldが見つかりません。2台のコンピュータ間でldの動作が異なる

問題は、2番目のコンピュータでは、ldが指定されたパスの先頭にパスを追加することがわかりましたが、なぜそれがそれを行うのか分かりません。

誰にも解決策がありますか?

+3

'-l'はパスでは動作しません。 –

+0

"パスを追加する"?別のパスに複数のパスを追加するとどういう意味ですか?私は理解できません –

+0

私は-l:/usr/lib/libc.soをやっているとしましょう。 ldは、/usr/lib//usr/lib/libc.soを/lib//usr/lib/libc.soなどにロードしようとします。 – hawaya

答えて

3

-lは、ライブラリの名前を指定するためのものです。例えば。 -lfooと書いた場合、gccはlibfooを探します。最初に動的バージョン(libfoo.so)が見つからない場合は、静的バージョンの場合はlibfoo.aとなります。 パスを含めるとでなく、です。

しかし、ここで、はgccでlibfoo.soを探しますか? これは2つのPCで異なる標準パスを使用しているため、一方のPCでは動作し、他方のPCでは動作しません。より多くのライブラリ検索パスを提案するには、パラメータ-Lを使用します。複数回出現することがあります。

例:gcc ... -lfoo -lbar -L/my/path/to/libraries1 -L/my/second/library/pathは、標準の検索ディレクトリ内などカスタムディレクトリ/my/path/to/libraries1/my/second/library/pathlibfoo.solibbar.so探し(多分libfoo.alibbar.a)。ファイル名、ldはそれ以外の場合は、ライブラリパスを検索します、filenameというファイルのライブラリパスを検索します:フォーム のnamespecある場合

+1

名前の前に ":"を入れる目的は何ですか?私は文字通りのパス指定が可能であるという印象を受けました。 –

+0

私はcmakeを使ってMakefileを生成するので、コンパイルのパラメータは選択しません。 – hawaya

+0

-l:パスを通過するためのものです、私の間違いです。しかし、2台目のPCのように、すべてのプラットフォームとバージョンでサポートされていないか、パスが間違っているか、ライブラリがそこにインストールされていない可能性があります。 – hunger

0

ldの-lオプションのmanページには、

を語りますlibnamespec.aというファイルの場合

これは後にパスすることを私に言う:ライブラリ検索パスにを見つけることを試みます。したがって、パスは、ライブラリ検索パス内の各パスに関連するパスとして解釈されます。リンカーステートメントに-L/を追加してみてください。これにより、リンク時の検索パスにルートディレクトリが追加され、リンカはルートディレクトリ内の-l:/path/to/libraryを検索し、あたかも絶対パスであるかのように動作します。

各コンピュータでld --verbose | grep SEARCHを使用してライブラリの検索パスを確認すると、1つが動作する理由ともう1つが動作しないことがわかります。私にとっては、図書館の検索結果に/はありません。-L/を指定せずに絶対パスにリンクすることはできません。

関連する問題