Почему другие модули не компилируются? - PullRequest
4 голосов
/ 11 октября 2011

У меня есть два файла: Main.d и ImportMe.d.Их цели должны быть самоочевидными.Они находятся в одном каталоге и не имеют явного объявления модуля.Однако, когда я пытаюсь скомпилировать Main.d, я получаю ошибку «символов не найдено»не обязательно делать это со стандартной библиотекой.Что это делает по-другому?Изменение пути включения с помощью -I не имеет видимого эффекта.

Ответы [ 2 ]

5 голосов
/ 11 октября 2011

Когда вы компилируете модуль, 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 мог его найти.

4 голосов
/ 11 октября 2011

Вам не нужно указывать модули из стандартной библиотеки, потому что компилятор неявно передает предварительно скомпилированный файл стандартной библиотеки .lib компоновщику.Для ваших собственных проектов рассмотрите возможность использования rdmd или другого инструмента для сборки.

...