Использование внешней библиотеки в D - PullRequest
7 голосов
/ 20 февраля 2011

У меня есть пакет DMD + Tango на Linux. Пожалуйста, дайте мне пошаговую информацию, как я могу использовать внешнюю библиотеку в D, например zlib. Я собрал ZLIB.

У меня есть такое дерево файлов:

myzlib
├── include
│   ├── zconf.h
│   └── zlib.h
└── lib
    └── libz.a

У меня есть import tango.io.compress.ZlibStream; звонок в моем myfile.d источнике.

И вот мои вопросы:

  1. Нужно ли копировать эти файлы в каталог dmd/lib?
  2. Нужно ли изменять dmd/bin/dmd.conf файл?
  3. Как мне вызвать dmd компилятор (dmd myfile.d -Llibz.a) или что-то еще (может быть, с абсолютными путями)?

Я никогда не пытался использовать внешние библиотеки на любом другом языке. Пожалуйста, помогите мне.

Ответы [ 2 ]

8 голосов
/ 20 февраля 2011

Флаг -L указывает компоновщику добавить конкретный каталог к ​​его пути поиска.

-l говорит ему связать определенную библиотеку, и он ищет в своем пути поиска, чтобы найти эту библиотеку.

При использовании DMD вы должны передать флаги компоновщику с флагом -L. Он может принимать как абсолютные, так и относительные пути, но пути должны быть относительно того, откуда запускается компилятор. Так что, если вы используете относительные пути, то вам всегда нужно запускать компилятор из одного каталога (что, как правило, не является проблемой, так как у вас обычно есть команда build в Makefile, из которой вы всегда запускаете тот же каталог) .

Наиболее распространенным является использование абсолютных путей для библиотек, установленных в системе, и относительных путей для библиотек, специфичных для вашего проекта.

Итак, если у вас есть библиотека myzlib/lib/libz.a, вы передадите -L-Lmyzlib/lib -L-lz в dmd.

Затем он добавил бы myzlib/lib к пути поиска компоновщика, а затем нашел libz.a в своем пути поиска (компоновщик знает, что должен принять участие после -l, добавив lib перед ним и добавьте в конец суффикс .a, чтобы получить нужную библиотеку) .

Вы можете добавить флаги компоновщика в dmd.conf, но я бы не советовал. Флаги в dmd.conf - это то, что dmd всегда использует для каждой программы. Таким образом, вы должны иметь только те флаги, которые используются во всех ваших программ.

Скорее, передавайте их непосредственно dmd (будь то в командной строке или как часть Makefile).

Что касается заголовочных файлов, вам потребуется продублировать любые их объявления, которые вам нужны, в файле .d.

Заголовочные файлы используются компилятором C или C ++, а не компоновщиком. D использует тот же компоновщик, что и для C или C ++, но его компилятор dmd, а не gcc.

Итак, вам нужно продублировать объявления C в D-файле. Самый простой способ сделать это с помощью утилиты htod , но она работает только в Windows или Wine.

В любом случае, вам нужно объявить объявления C, которые вы будете использовать, в файле .d и пометить их extern(C).

1 голос
/ 20 февраля 2011

Если вы настроили свою сборку так, чтобы она выполняла шаги компиляции и компоновки отдельно (как это обычно делают с c), то это, по сути, идентично выполнению того же самого с C. Во-первых, заставьте вашу сборку работать без дополнительной библиотеки ( чтобы убедиться, что вы передаете все необходимые флаги компоновщику), а затем добавьте библиотеки как обычно. Чтобы использовать библиотеку C из D, требуется файл привязок, фактически это просто файл D, состоящий только из прототипов.

...