Dllについて、依存しているか、再配布できるか、プラットフォームツールセットとは

less than 1 minute read

ある実行ファイルが何のDLLに依存しているか調べる

dumpbin.exe 調べたい実行ファイルのフルパス /IMPORTS

.\dumpbin.exe “Z:\hoge.exe” /IMPORTS

dumpbin.exe は visual studio をインストールしたディレクトリのどこかにあると思うのでそこで検索で。

依存したその dll がない

たとえば visual studioでvc++で作ったものはプロジェクトの設定によっては msvcpなんとか.dll に依存していたりするけど、 これはvisual studioをインストールするとついてくるdllなので visual studioをインストールしていないであろう一般ユーザーはそのプログラムを動かすことができない。起動しようとすると dll がないよエラーになる。

となると依存しないように修正するか、その依存dllを同梱つまり再配布しちゃうか考えることになる。

その dll に依存しないようにする場合

msvcpなんとか.dll について今回は考える。

方法 A : ランタイムライブラリ変更

プロジェクト設定で c/c++ -> コード生成 -> ランタイムライブラリ
ここで
MTd
MT
のようにDLLのつかないものを選ぶ。

方法 B : プラットフォーム ツールセット変更

構成プロパティ -> 全般 -> プラットフォーム ツールセット
ここを変えてみる。 すると依存するものが変わる。

osによって標準で入っているdllが違うみたいで、この方法によってそのプログラムが使われると想定されるプラットフォーム標準のdllに依存するようにできればそれでよし。

プラットフォーム ツールセットについて補足:
たとえば visual studio 2015 で作ったプロジェクトAがあって、ある時点から2017をインストールして2017でプロジェクトAに依存するプロジェクトBを作って、その2つが同じソリューションにあって2017でそのソリューションを開いてもべつにプラットフォームは新しいものに更新されたりはせず別々にそのまま。違うまま。
プラットフォームツールセットが違うせいでエラーがでる場合があるよ。たとえばプロジェクトAでつくったlibをプロジェクトBではスタティックリンクに使ってる場合にビルドでエラーがでるんじゃないかな。

詳しいことはだれか補足して。

使い分け

ビルドのオプションでたとえば /ZW /MT は同時に指定できないので 方法 A が使えないので 方法 B を試すといい。

同梱する場合

msvcpなんとか.dll について今回は考える。

再配布していいのか調べる必要がある。再配布不可なら別の方法を考えるしかない。

再配布可能かどうかは今回の場合は visual studioインストールでついてくるdllで、 再配布する DLL の決定
ここによると

再配布を許可されているのは、Redist.txt またはオンラインの “REDIST list” で指定されているファイルだけです。

とある。
Redist.txt はvisual studioをインストールしたディレクトリのどこかにあるので検索で。

ほかに再配布で気をつけること

msvcpなんとか.dll について今回は考えるのでここではvc++について。

再配布する DLL の決定

アプリケーションのデバッグ バージョンと、各種の Visual C++ デバッグ DLL は、再配布できません。

再配布するときはデバッグバージョンじゃないことを確認しておこう。

あとがき

vc++やc++/cxでの話をしたけど、他の場合は全然知らない。 今回の場合に限らず、補足や修正とかあれば教えて下さい。

Comments