30

リンク中に次の警告が表示されます。

/usr/bin/ld: warning: libxxx.so.6, needed by /a/b/c/libyyy.so, not found (try using -rpath or -rpath-link)

環境変数LD_LIBRARY_PATH=path_to_libxxx.so.6を設定すると、警告が表示されなくなります(-Lpath_to_libxxx.so.6を追加しても効果はありません)。

別のコンパイルサーバーがあり、結果のバイナリはコンパイルのみです。バイナリは他のサーバーで実行され、そこでlibxxx.so.6がバイナリによって認識されます(でチェックされますldd executable)。

コンパイル時に警告を取り除く他の方法はありますか(私はそれを数回持っていますが、それは非常に迷惑です)?

4

4 に答える 4

42

次と同等のダイナミックライブラリを追加する必要があります-L

-Wl,-rpath-link,/path/to/lib

これにより、リンカは非標準の場所で共有ライブラリを検索しますが、リンクが正しいことを確認する目的でのみ使用されます。

プログラムが実行時にその場所にあるライブラリを検索するようにしたい場合は、同様のオプションがあります。

-Wl,-rpath,/path/to/lib

しかし、これがなくてもプログラムが正常に実行される場合は、それは必要ありません。

于 2012-11-30T13:41:14.663 に答える
6

必要なライブラリへのパスがランタイムリンカに認識されていることを確認してください。これは、/ etc /ld.so.conf.d/に必要なパスでファイルを追加することによって行われます。たとえば、/ etc / ld.so.conf.d/fooの内容は次のとおりです。

/usr/local/lib/foo/

非常に古いバージョンのLinuxを使用している場合、/ etc / ld.so.conf.d /がサポートされていない可能性があります。その場合、パスを/etc/ld.so.confファイルに直接追加する必要があります。

それが終わったら、「ldconfig」コマンドを実行してリンカのデータベースを更新する必要があります。

于 2012-11-22T07:35:02.420 に答える
2

私はこれが古いことを知っていますが、ここにもっと良い修正があります:

根本的な原因:

この問題は、GCCによって呼び出されたLDがライブラリの依存関係の解決を開始したときに実際に発生します。GCCとLDはどちらもsysrootを含むライブラリを認識していますが、LDには1つの重要なコンポーネントである/etc/ld.so.confファイルがない可能性があります。RaspberryPIシステムのexampleld.so.confファイルは次のとおりです。

/etc/ld.so.conf.d/*.confを含める

/etc/ld.so.conf.dディレクトリには、次のファイルが含まれています。

00-vmcs.conf: / opt / vc / lib

arm-linux-gnueabihf.conf:

/ lib / arm-linux-gnueabihf / usr / lib / arm-linux-gnueabihf

libc.conf:

/ usr / local / lib

ユニバーサルソリューション

 

この問題は、クロスツールチェーンのLDが見つけることができる場所にLD構成ファイルをコピーすることで簡単に解決できます。ただし、落とし穴が1つあります。クロスツールチェーンがMinGWで構築されている場合(ほとんどが)、おそらくglob()関数にアクセスできなかったため、*。confのようなワイルドカード対応のincludeステートメントを解析できません。 。ここでの回避策は、/ etc / ld.so.conf.dのすべての.confファイルの内容を手動で結合し、それらを/etc/ld.so.confに貼り付けることです。

* / opt / vc / lib

/ lib / arm-linux-gnueabihf

/ usr / lib / arm-linux-gnueabihf

/ usr / local / lib *

正しいフォルダにld.so.confファイルを作成すると、ツールチェーンですべての共有ライブラリ参照を自動的に解決できるようになり、そのエラーメッセージが再度表示されることはありません。

于 2016-08-16T19:32:29.920 に答える
1

コマンドラインオプションを使用してこれらの警告を消音する唯一の方法は、不思議なことに機能しない-Lフラグです(これについての詳細を投稿できるかもしれません)。警告はによって生成されるため、リンカー警告を無効ldにすることを試みることができますが、GNU ldのドキュメントからは、この警告を(非)アクティブ化するオプションはありません。-Wl,option

したがって、これにより、この警告を除外するラッパースクリプトを作成するか、のカスタムバージョンをコンパイルする必要がありldます。

于 2012-11-30T13:26:49.663 に答える