Когда вы компилируете модуль, dmd должен иметь файлы .d или .di для всех модулей, которые требуются этому модулю в пути импорта. -I
позволяет добавлять пути к пути импорта. Однако это не создает эти другие модули. Он просто дает dmd то, что нужно для сборки модуля, который вы просили его собрать. И когда вы ссылаетесь, dmd нужны либо объектные файлы, либо двоичные файлы библиотеки для всех модулей, используемых в программе, в противном случае он будет жаловаться на неопределенные символы (-L
может использоваться для флагов компоновщика, если вы хотите связать в библиотеки). На этапе компоновки используется компоновщик C, поэтому он вообще не поддерживает D и ничего не знает о модулях.
Итак, если вы компилируете и связываете в два этапа, вы сначала компилируете каждый модуль отдельно или вместе с другими модулями, генерируя либо объектные файлы, либо библиотечные файлы, в зависимости от флагов, которые вы передаете компилятору (объектные файлы используются по умолчанию) , Затем вы связываете эти объектные файлы и библиотеки вместе на этапе компоновки, генерируя исполняемый файл.
Когда вы используете dmd, не передавая его -c
или -lib
, он выполняет компиляцию и компоновку вместе, поэтому вы должны предоставить все модули, которые вы намереваетесь скомпилировать, или когда он доберется до шаг связывания, это будет жаловаться на неопределенные символы. Он волшебным образом не идет и не компилирует все модули, которые импортируют модули, которые вы запрашиваете. Если вам нужно такое поведение, вам нужно использовать такой инструмент, как rdmd.
dmd может найти druntime и Phobos без необходимости указывать их из-за dmd.conf (в Posix) или sc.ini (в Windows). Этот файл конфигурации добавляет соответствующие файлы .d и .di к пути импорта и добавляет libphobos.a или phobos.lib (в зависимости от платформы) в DFLAGS
, чтобы dmd мог найти эти модули при компиляции ваших модулей и связать их в библиотека в фазе связывания. Он также добавляет любые другие флаги, необходимые для работы стандартной библиотеки (например, ссылки в librt в Linux). Если вы переместите какой-либо из этих файлов в нестандартные места, вам нужно изменить этот конфигурационный файл, чтобы dmd мог его найти.