Существуют проблемы совместимости с 32-x битными файлами DMD в Windows x64, так как они скомпилированы с использованием DMC фоновых программ, которые могут производить только OMF двоичные файлы. Поэтому для того, чтобы избежать проблем с подключением к внешним скомпилированным библиотекам, гораздо легче придерживаться использования 64-разрядных двоичных файлов. Это можно осуществить использованием Visual Studio компоновщика для DMD, который будет создавать совместимые COFF двоичный файлы. Еще одна проблема в том, что 32-битные DMD двоичные файлы связаны с устаревшими 32-битными библиотека WinAPI, в которых отсутствуют некоторые очень важные функции, в то время как 64-разрядные двоичные файлы должны быть связаны с 64-битными библиотеками, поставляемыми в SDK Windows. Решим эту проблему.
Для начала нужно установить Microsoft Windows SDK for Windows. Найти различные версии можно по ссылке http://www.microsoft.com/en-us/search/result.aspx?q=sdk%20windows. Скачиваем для своей версии Windows. Устанавливаем.
Директория установки Windows SDK в Windows 7 по умолчанию — C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\. Создадим системную переменную VCINSTALLDIR с данным адресом директории.
Далее нам будет предложено выбрать устанавливаемые средства разработки, нам важны только 64-x разрядные библиотеки и компилятор Visual Studio, выберем данные пункты.
Далее создадим ещё одну системную переменную DEV_DIR_WINSDK, в которой будет храниться путь к Windows SDK. В моё случае это C:\Program Files\Microsoft SDKs\Windows\v7.1\.
Теперь необходимо отредактировать файл конфигурации компилятора DMD, он находится по пути dmd2\windows\bin\sc.ini. Файл разбит на разделы, которые отмечены квадратными скобками, на потребуется изменить данные в разделе Environment64:
- Изменим значение параметра LINKCMD на %VCINSTALLDIR%\bin\amd64\link.exe
- Раскомментируем строку WindowsSdkDir= и приравняем к %DEV_DIR_WINSDK%
- Далее необходимо закомментировать (символ «;») строки с параметром LIB, в которых прописаны пути к Wimdows SDK не для вашей платформы.
На этом настройка завершена, попробуем скомпилировать проект (запись блога ), открываем командную строку, пишем:
rdmd -m64 C:\D\projects\test\hello.d
Если всё прошло удачно, будет выведено «Hello, World!». Поздравляю, теперь вы можете компилировать 64-х разрядные приложения на D для Windows.
Основная информация взята с http://wiki.dlang.org/Installing_DMD_on_64-bit_Windows_7_%28COFF-compatible%29
Короткая памятка для современных и старых сборок
Главная мысль остаётся той же: нельзя смешивать 32-битные OMF-библиотеки и 64-битную сборку. В старых установках DMD под Windows это часто упиралось в ручную настройку sc.ini, Windows SDK и Visual Studio linker. В более новых установках официальный установщик DMD обычно делает большую часть этой настройки сам, а для нормальной работы достаточно иметь Visual Studio Build Tools или установленную Visual Studio с C++ tooling.
Для простой 64-битной сборки используем явную архитектуру:
dmd -m64 main.d -of=app.exe
dub build --arch=x86_64
Если используется старая 32-битная сборка, смотрим, какой формат объектных файлов нужен проекту. Старый OMF и MS-COFF несовместимы между собой. Для современных библиотек Windows чаще нужен MS-COFF, а для 64-битной сборки это фактически обычный путь.
- Проверьте, что внешние .lib файлы собраны под ту же архитектуру.
- Запускайте сборку из Developer Command Prompt или x64 Native Tools Command Prompt, если компоновщик не находится.
- Если DMD не видит linker, проверьте переменные окружения и секцию Environment64 в sc.ini.
- Если проект собирается через DUB, фиксируйте архитектуру в команде или конфигурации сборки.
Типичная ошибка выглядит так: код компилируется, а линковка падает на внешней библиотеке. В большинстве случаев виноват не D-код, а то, что рядом лежит библиотека другого формата или другой разрядности. Сначала проверяем toolchain и зависимости, и только потом ищем ошибку в исходниках.