dmd 2.061でWindows 64bitがサポートされました。
しかしビルドするだけでも一苦労だったのでメモっておきます。
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にあるのですが
パス設定が面倒なのでlink.exeと同じフォルダにコピーしました。訂正: 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対応が必要になってくるのでどうしようかと思うわけです。