Visual Studio 2013 で msvcrt.dll にリンクする

Visual Studio Community 2013 の cl.exe によるビルドにおいて、生成される実行ファイルが msvcr120.dll ではなく msvcrt.dll をリンクするようにする方法・更にはどちらにもリンクさせない方法をメモしておく。

Visual Studio Community 2013 ダウンロードサイト

Microsoft が個人開発者や小規模組織等向けに公開している Visual Studio 無償版の名称は、Visual Studio Community である。

f:id:ray0mg:20150827213445p:plain

Visual Studio Community 2013 with Update 5 (ISO)
go.microsoft.com/fwlink/?LinkId=532496
Visual Studio 2013 Language Pack (日本語)
go.microsoft.com/fwlink/?LinkID=320680

情報源を元にやってみる

タイトルの方法については以下のサイトに全て書かれている。

すなわち、Windows Driver Kit の中に、良い msvcrt.lib がある。

Download Windows Driver Kit Version 7.1.0 from Official Microsoft Download Center
download.microsoft.com/download/4/A/2/4A25C7D5-EFBE-4182-B6A9-AE6850409A78/GRMWDK_EN_7600_1.ISO

なんとかして msvcrt.lib を取り出す

F(ISO):\WDK から以下のファイルを例えば C:\wdk\ に置く。

  • libs_x86fre.msi
  • libs_x86fre_cab001.cab

C:\wdk\ にてコマンドプロンプトで以下を実行する。

msiexec /a libs_x86fre.msi /qb targetdir=C:\wdk\temp\

これで CAB 圧縮ファイルがうまい具合に展開されて、目当ての msvcrt.lib が以下のパスに出現している。

  • C:\wdk\temp\WinDDK\7600.16385.win7_wdk.100208-1538\lib\Crt\i386\msvcrt.lib

この msvcrt.lib を C:\wdk\lib\ にでも入れておく。

使用例

以下のコードは、cl.exe でうまくビルドできるよう環境変数を整えるためのバッチファイルである。

@echo off
setlocal
set path=%path%;"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin"
set include="C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\crt\src";"C:\Program Files (x86)\Windows Kits\8.1\Include\shared";"C:\Program Files (x86)\Windows Kits\8.1\Include\um";
set lib="C:\wdk\lib";"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\lib";"C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x86"
if "%*" GTR "" (cmd /c %*) else (cmd /k prompt[VS]$P$G)
endlocal

このように、環境変数 lib に C:\wdk\libなるべく先頭に入れておく。

これで、ビルドする際には良い msvcrt.lib が使用され、msvcrt.dll にリンクされるようになる。

あるいは、C言語ソースコード中に標準ライブラリの関数等を使っておらず、リンカオプションで独自にエントリポイントを指定 /ENTRY:__start__ した場合は、msvcrt.dll へのリンクもされなくなる。