0

私の質問は、Windows と Linux の両方の環境での動的ライブラリの読み込み (「abc.dll」または「abc.so」) に関連しています。

dll または共有メモリがあります。そして、このdll(abc.dllまたはabc.so)を使用する必要がある2つのアプリケーションがあります。これで、この dll (abc.dll または abc.so) のコピーを実行可能ファイルのそれぞれのフォルダーに配置しました。

/folder-one/app1.exe
/folder-one/abc.dll (resp. abc.so)
/folder-two/app2.exe
/folder-two/abc.dll (resp. abc.so)

今私が実行すると、その& 実行から -library (abc.dll または abc.so) がapp1.exeロードされます。 今私が実行すると、その& 実行から -library (abc.dll または abc.so) がロードされます。abcfolder-one
app2.exeabcfolder-two

Q-1 ここで質問したいのは、両方のアプリケーションを実行すると、読み込まれた dll のコピーが 2 つあるということですか?

ローダーは、Linux と Windows の両方の環境で共有ライブラリ (abc.dll または abc.so) をメモリにロードします。 http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html

Q-2 共有ライブラリ (abc.dll または abc.so) をそれぞれのフォルダに個別にコピーすることのデメリットはありますか?

Q-3 両方のアプリケーションから単一の dll をロードしたい場合、(両方のアプリケーションがそれを見つけることができるように) 共通の場所はどこにあるべきですか?

4

2 に答える 2

0

Windows では、DLL が既にロードされていて、同じモジュール名の DLL をロードすると、ロードされたものを返し、わざわざ検索する必要はありません。

システムは DLL を検索する前に、次のことを確認します。

同じモジュール名の DLL が既にメモリにロードされている場合、システムは、それがどのディレクトリにあるかに関係なく、ロードされた DLL を使用します。システムは DLL を検索しません。

この非常に長い MSDN ページで説明されているように(これは一見、Windows の tore アプリのみに関連しているように見えますが、少なくとも Win7 から変更されていないと思われるデスクトップ モードについて述べています)

ただし、これは最近の多くのことに依存していると思います。Windowsストアアプリ、.net dll、またはwin32 dllを実行していますか。私は、.net がプローブのシステムを使用して dll を見つけることを知っています。次に、dll がサイド バイ サイド コンポーネントとして保持されているかどうかも判断する必要があります。

昔の記憶、それから現在のディレクトリ、それからパスが分かりやすかったです。Linuxはこのアプローチを使用していると思います。

于 2013-10-17T14:41:13.893 に答える