しかしビルドするだけでも一苦労だったのでメモっておきます。
64bitコンパイルオプション
64bitでビルドするオプションは-m64です。dmdのUsageに出てこないので気づきにくいと思います。
リンカ
64bitビルドではVCのリンカを使うようになっています。よってVCのリンカのパスを設定する必要があり、sc.iniのLINKCMD64で指定します。
私の環境ではMicrosoft Visual Studio 2012 Expressを入れていたので下記のようになりました。
LINKCMD64=C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\x86_amd64\link.exe
この辺りはご利用の環境に合わせて調整してください。
参考ですが、私の環境だとlink.exeの実行時にmspdb110.dllが見つからないと言われました。
mspdb110.dllはC:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDEにあるのですが
訂正: mspdb110.dllをコピーで置いてしまうとVSの動作に影響が出るので、置いてあるフォルダを環境変数PATHに追加します。
VCINSTALLDIRの設定
sc.iniに増えた謎の変数VCINSTALLDIRはVCのlibフォルダを参照するための物です。VCのlibフォルダにあるCランタイムライブラリ等が必要になるためです。
もちろんLIB変数にVCのlibフォルダを直接設定しても動くのですが、
32bit版と混ざるのでVCINSTALLDIRを設定した方がいいでしょう。
この変数がどう使われるかはdmd2\src\dmd\link.cを見ればわかります。
1 | const char *vcinstalldir = getenv("VCINSTALLDIR"); |
---|---|
2 | if (vcinstalldir) |
3 | { cmdbuf.writestring(" \"/LIBPATH:"); |
4 | cmdbuf.writestring(vcinstalldir); |
5 | cmdbuf.writestring("lib\\amd64\""); |
6 | } |
linkのオプションに/LIBPATH:として指定しています。
よって私の環境では以下のような設定になりました。
VCINSTALLDIR=C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\
※プログラムを見るとわかりますが、最後のバックスラッシュが必須です。
WindowsSdkDirの設定
sc.iniに増えたもう一つの謎変数WindowsSdkDirはWindows SDKのlibフォルダを参照するための物です。Windows用の各種libが必要になるためです。
こちらもLIB変数でも指定できますが、VCINSTALLDIRと同じ理由でWindowsSdkDirを設定した方がいいでしょう。
変数の使われ方についてもVCINSTALLDIRと同じです
1 | const char *windowssdkdir = getenv("WindowsSdkDir"); |
---|---|
2 | if (windowssdkdir) |
3 | { cmdbuf.writestring(" \"/LIBPATH:"); |
4 | cmdbuf.writestring(windowssdkdir); |
5 | cmdbuf.writestring("lib\\x64\""); |
6 | } |
私の環境ではWindows SDK for Windows 7をインストールしてあったので以下のような設定になりました。
WindowsSdkDir=C:\Program Files\Microsoft SDKs\Windows\v7.1\
以上で64bit版Windowsのビルドは出来ます。
ただ、本格的にWindows用プログラムを書こうと思うと
Windowsモジュールの64bit対応が必要になってくるのでどうしようかと思うわけです。