Cランタイムは動的にリンクすべきだ

EXEにCランタイム(以下CRT)の関数を埋め込むのは良くないです。
動的にリンクしたい場合、Visual C++では「/MD」スイッチを利用します。

理由は以下のとおり。

・複数のCRTが同時に読み込まれるのを避ける

異なるバージョンのCRTは情報を共有しません。複数初期化されたり、環境変数を設定しても一部にしか反映されなかったりします。メモリの開放をするどころか、ファイルポインタの共有すら出来ません。


特に、Visual C++では、静的リンクされたCRTをもつDLLが、1つのモジュールに同時に読み込まれる事を保障していません。特にマルチスレッドとシングルスレッドCRTを混ぜてしまう人が多いようです。そのような問題を発見するのは非常に困難です。

・Cランタイムにバグがあった場合、コンパイルしなおす必要がある

静的リンクはDLLを必要としない反面、修正も困難になるのです。
特にVisual C++のCRTであるMSVCRT.DLLは「known-dll」としてシステムに組み込まれていて、今後アップデートされる可能性があります。静的リンクではこの恩恵を受けられません。

次に動的にリンクしてDLLを作成した場合の注意点を述べます。

・呼び出し側もCランタイムを動的にリンクする必要がある

DLLを呼び出す側のすべてのモジュールでCRTを動的にリンクする必要があります。さもないと、CRTの複数のコピーが作成されてしまい、予期しない動作を引き起こします。

最後に一言、複数のDLLやEXEが存在する場合、例え同じコンパイラを利用しても、複数のCRTが存在する可能性があります。この問題も動的リンクにして再コンパイルする事で解決すべきです。

Leave a Reply

最初のコメントを頂けますか?

更新通知を受け取る »
avatar
wpDiscuz