Visual C++ ... MD と MT option | Chandler@Berlin

Chandler@Berlin

ベルリン在住

これは非常に限られた人向けの記事です.もし,あなたが Visual Studio C++ (2008) を使っていて,MT と MD という option が何を示しているのか知りたい場合には,もしかしたら面白いかもしれません.

私が STL を使った console application を Visual C++ 2008 上で開発している時,次のようなリンカエラーでアプリケーションが作成できないことがありました.

error LNK2001: unresolved external symbol __imp___CrtDbgReportW

これは Windows の runtime library に関係があります.まず,W がついているのは Unicode 関係なので Unicode を off にしましたが,解決できません.

これは C/C++ の Code 生成に関係があります.Multi-threaded Debug DLL(/MDd) あるいは Multi-threaded debug (/MTd) というものです(一文字しか違わないので注意).アプリケーションを作っている際に,何かの拍子で私はライブラリのコンフリクトがあるという warning が出力されていることに気がつきました.link プログラムがコンフリクトを避けるには ignore library を指定せよというので,メッセージに従って MSVCRT というライブラリを無視するようにしたのですが,これが問題だったようです

このリンクエラーを解決するために,Code Generation を全て Multi-threadedDebug DLL (/MDd) (for debug)としました.そして無視するライブラリをなくしました.これでリンクすることができました.しかし,この warnning は混乱のもとです.

そこで,同僚の T に,いったい MD とか MT とは何か,どちらを使うべきなのかを尋ねました.彼の回答は以下のようなものです.

- MT: Mutil-threaded static library. これはアプリケーションを配布するには良い.全部 static にリンクされているので,環境に依存しないからである.

- MD: Mutil-threaded Dynamic link library. しかし,完結したアプリケーションではなく,ライブラリを配布する際には,dynamically link の方が良いことが多い.なぜならば,あるライブラリに静的にランタイムがリンクされている場合には,バーションのコンフリクトがあるかもしれない.今プログラムを作成している環境のランタイムと,ライブラリが静的にリンクした環境のランタイムが同じ保証はない.たとえば,ライブラリの内部で使っているnew/delete と手元のランタイムの new/delete のバージョンが違う場合にはライブラリが new して手元のコードが delete するかもしれない.これはバージョンによっては問題だ.

つまり,このオプションはどんなアプリケーション,ライブラリを作るかに依存して決めなくてはいけないものです.選ばなくてはいけないのはめんどうだなと思ったのですが,二つある理由はわかりました.でもこんなに似ていると間違えやすいです.