Использование внешней библиотеки в D

У меня есть связка 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) или как-то еще (может быть, с абсолютными путями)?

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


person Sigillum Diaboli    schedule 20.02.2011    source источник


Ответы (2)


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

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

При использовании DMD вы должны передавать флаги компоновщику с флагом -L. Он может принимать как абсолютные, так и относительные пути, но пути должны указываться относительно того, откуда запускается компилятор. Поэтому, если вы используете относительные пути, вам всегда нужно запускать компилятор из одного и того же каталога (что обычно не является проблемой, поскольку обычно команда сборки находится в 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. или вино.

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

person Jonathan M Davis    schedule 20.02.2011

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

person BCS    schedule 20.02.2011