4

私は、Windows XP で gcc コンパイラ (MinGW) を使用しています。.dll ライブラリを作成しましたlibdir.dllが、そのライブラリを使用するプログラムをビルドしようとしました。
その .dll ファイルを System または System32 フォルダーに入れたり、PATH 変数にパスを設定したりしたくありません。その情報をプログラム自体に提供したいのです。とスイッチが利用できる
ことはわかっているので、そのうちの 1 つにリンクするつもりでした。-R-rpath

最初の -rpath:
gcc -L /path/to/lib -Wl,-rpath, /path/to/lib main.o -ldir -o prog

-R より:
gcc -L /path/to/lib -Wl,-R, /path/to/lib main.o -ldir -o prog

これは正常にリンクされますprogが、プログラムを起動すると Windows が見つからないというメッセージを出力しますlibdir.dll
私の質問は、何がうまくいかなかったのか、libdir.dll適切なスイッチを使用している場合でも実行時にパスが不明なのはなぜですか?

libdir.dll の独自のコピーを含む prog1 と prog2 があり、両方がライブラリにコードをロードすると同時に実行を開始するとします。コピーして両方のプログラムに使用しますか?
2 番目の質問は、ライブラリがどのようにロードされるか (任意の OS) に関するものです。リンカは常にライブラリ全体をロードしますか、それとも必要な部分だけをロードしますか?たとえば、プログラムfoo()がライブラリ内の関数を参照する場合、リンカは最初にその関数またはライブラリ全体のみをメモリにマップしますか?

4

2 に答える 2

2

この質問の一部は、この質問の複製です: Is there a Windows/MSVC equal to the -rpath linker flag?

答えの要約は、Windows には RPATH に直接相当するものがないということです。

デフォルトのライブラリ検索パス (Windows では、リストしたシステム ディレクトリと PATH 環境変数のディレクトリが含まれます) に DLL を配置することを除外したため、次のオプションが残されています。

  • バッチ ファイルの使用
  • すべての DLL と実行可能ファイルを同じディレクトリに配置する
  • DLL 検索パスに追加するためにプログラムで OS レベルの呼び出しを行う
于 2013-08-21T16:03:24.290 に答える
2

実際の選択肢は 2 つだけです。DLL を EXE と同じフォルダに置くか、EXE の作業ディレクトリに置きます。デフォルトの作業ディレクトリをEXEを含むディレクトリとは異なるものにするショートカットを作成する必要があるため、後者はあまり選択肢にはなりません。

DLL を EXE と同じディレクトリに配置しないことは、DLL を他のアプリケーションと共有する場合にのみ意味があります。これにより避けられない DLL 地獄を回避するには、DLL をサイド バイ サイド キャッシュに格納する必要があります。マニフェストを作成して EXE に埋め込むために必要なツールと、DLL をターゲット マシンに展開するために必要なインストーラーは、ツール チェーンではおそらく入手が困難です。とにかく行われることはめったにありません。

于 2010-07-17T16:57:40.087 に答える