なぜ`lddなのか?` 出力 "??? => ???" (ライブラリと場所の両方に疑問符があります)?

なぜ`lddなのか?` 出力 "??? => ???" (ライブラリと場所の両方に疑問符があります)?

実行中に検索エンジンを介して「Linux」、「」、およびldd <dynamic_lib>??? => ???ldd??? => ???

関連する可能性があります:問題の動的ライブラリは、組み込みのGCCスイートを使用してWindows 10のMSYS2でコンパイルされました。

答え1

このlddコマンドは、実行/使用時と同様に、実行可能ファイルまたはライブラリをシステムの共有ライブラリにリンクしようとします。与えられたファイルからライブラリ参照を読み、ファイルシステムとpath()で見つけようとしますLD_LIBRARY_PATH。 「」と表示されている場合は、システムが???一部のライブラリを見つけることができないことを意味します(そして、確認したプログラム/ライブラリが実行されていないか利用できない可能性があります)。

ライブラリの問題は、通常、あるシステムから別のシステムにファイル(実行可能ファイルまたは共有オブジェクトライブラリ)をコピーするときに発生します。その理由は、システムライブラリが異なるためです。たとえこれらのライブラリが他のバージョンのために存在していても。

時々、解決策は欠けているライブラリをコピーして置くことですLD_LIBRARY_PATH。コピーしたライブラリファイルをシステムにインストールしたくないので、この目的のためにその変数を設定したり、新しいフォルダを追加することもできます(!)。

lddソースシステムで実行して、コピーするライブラリを見つけることができます。

これが独自のプログラムであるか、または直接コンパイルした場合は、実際にどのライブラリが欠落しているかを確認できます。

ライブラリを識別したら、個人用フォルダにコピーすることができます(たとえば、にコピー)~/libs。次に、このフォルダをライブラリパスに追加します。

export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}":~/libs

変数がすでに存在する場合(テストパスecho $LD_LIBRARY_PATH)、または

export LD_LIBRARY_PATH=~/libs

そうでない場合(bashシェル構文の2種類)。

それからlddもう一度やり直してください。

後で変数を設定してからプログラムを起動するシェルスクリプトを使用して、いつでも実際のプログラムを起動できます。

答え2

WindowsのMSYS2で同じ問題がある場合(GCC Suiteを使用して共有ライブラリをコンパイルし、ライブラリに実行可能ファイルをリンクし、実行時に依存関係が見つからないことを発見)、次のことができます。

  1. 共有ライブラリを実行可能ファイルと同じディレクトリにコピーします。
  2. 実行可能ファイルと同じディレクトリから共有ライブラリに接続します。
  3. 共有ライブラリを含むディレクトリを含むようにPATH環境変数を変更します。

MSYS2はWindows上でUnixに似た環境を提供できますが、Windowsが実行時に実行可能ファイル(共有ライブラリを含む)を検索する方法に従う必要があります(簡単に言うと、LD_LIBRARY_PATHは意味がなく、リンカーは指定されたパスに気を配らない)。 rpathを使用してください。

関連情報