progcode_D / PHP / WEB

D

Компиляция 64-x разрядных программ на DMD под Windows x64

Историческая настройка DMD x64 на Windows: COFF, компоновщик, SDK и минимальная проверка без смешения старых и новых путей.

Эта заметка относится к старой связке DMD, Windows 7, Visual Studio 2010 и Windows SDK 7.1. В ней решалась практическая проблема: как собирать 64-разрядный D-код с совместимыми объектными файлами и библиотеками Windows. Для новой установки используйте инструкцию к своей версии DMD; пути ниже имеют исторический смысл.

Разрядность и формат объектов

В рассматриваемой конфигурации 32-разрядный вариант DMD использовал инструментальную цепочку Digital Mars и формат OMF. Внешние библиотеки Microsoft могли требовать другой формат. Для 64-разрядной сборки использовались Microsoft-совместимые COFF-объекты и соответствующий компоновщик. Нельзя смешать 32- и 64-разрядные библиотеки только сменой имени каталога.

В текущей справке DMD для Windows флаг -m64 описан как генерация 64-разрядных MS-COFF объектов. Эта ссылка полезнее поиска случайного старого дистрибутива SDK.

Историческая настройка инструментов

  1. Устанавливались средства C++ нужной разрядности и Windows SDK. Наличие только IDE или только заголовочных файлов не заменяет компоновщик и библиотеки.
  2. Переменная VCINSTALLDIR указывала на каталог инструментов Visual C++; в примере это C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC. Это не универсальный путь Windows SDK.
  3. Отдельная переменная DEV_DIR_WINSDK указывала на SDK, например C:\Program Files\Microsoft SDKs\Windows\v7.1.
  4. Перед изменениями сохранялась копия dmd2\windows\bin\sc.ini. В секции [Environment64] проверялись значения для 64-разрядного компоновщика и путей библиотек.
[Environment64]
; Фрагмент старой конфигурации, не полный современный sc.ini
LINKCMD=%VCINSTALLDIR%\bin\amd64\link.exe
WindowsSdkDir=%DEV_DIR_WINSDK%

В старом рецепте отключали строки LIB, указывавшие на неподходящую платформу. Не удаляйте все пути подряд: компоновщику всё ещё нужны корректные библиотеки выбранного SDK и runtime. У современных установщиков и версий DMD выбор инструментов может происходить иначе.

Минимальная пробная программа

import std.stdio : writeln;

void main() {
    writeln("Hello, World!");
}

Сохраните файл как hello.d и запустите в настроенной командной строке:

dmd -m64 -run hello.d

В первоначальном примере использовался rdmd -m64 C:\D\projects\test\hello.d. Прямой запуск DMD уменьшает число участвующих инструментов при диагностике. После успешной компиляции отдельно проверьте связывание именно той внешней библиотеки, ради которой настраивалась среда.

Если компиляция не удалась

  • Не найден link.exe: проверяйте путь и установленные средства C++, а не исходник D.
  • Не найдена библиотека: проверяйте её наличие, разрядность и пути поиска.
  • Несовместимый формат объекта: сопоставьте формат и архитектуру всех входных файлов.
  • Не переносите весь старый sc.ini в новую версию; сравнивайте только нужные параметры с документацией установленного компилятора.
КОНЕЦ ЗАМЕТКИ↑ В начало