Как использовать библиотеку C из D? - PullRequest
18 голосов
/ 27 октября 2009

Сегодня я слышал о программировании на D и о том, что оно совместимо с кодом C. Тем не менее я не нашел никакой информации о том, можно ли использовать библиотеки C, такие как GTK или PortAudio, из D? Если это возможно, не могли бы вы объяснить, как это сделать?

Ответы [ 5 ]

19 голосов
/ 27 октября 2009

Можно вызывать библиотеки C из D. Что вам нужно сделать, это преобразовать заголовочные файлы C в D. По большей части это довольно просто, и есть сложная в использовании команда -линия , чтобы помочь автоматизировать процесс. Это никогда не работало для меня ни на чем, кроме как на игрушечных примерах, но это могло бы стать хорошим началом, чтобы увидеть, какие преобразования нужно сделать. Просто поместите фрагмент, который у вас не получается перевести в заголовок, и посмотрите, что с ним делает htod.

Самая большая проблема, с которой вы обычно сталкиваетесь, - это творческое использование препроцессора Си. Некоторые вещи могут быть превращены в операторы version () в D, но не все.

Что касается фактической компиляции и связывания с кодом, на Unix-подобных платформах, я думаю, вы можете компилировать и ссылаться в коде C, используя GCC. В Windows вы должны либо скомпилировать файлы C, используя DMC, и связать с DMD. Или вы можете скомпилировать код C в DLL с помощью любого компилятора, способного на это, а затем для связи с DMD вам нужно создать совместимую с DMD библиотеку импорта из DLL. Это можно сделать с помощью инструмента implib, который можно найти в бесплатном пакете Basic Utilities , который можно приобрести в DigitalMars.

Есть также много таких переводов заголовков, которые уже были сделаны. Полезно сначала просмотреть проект Dsource Bindings или сначала спросить группы новостей digitalmars D, прежде чем приступать к чему-то большому, например, к переводу заголовков GTK. Многие популярные библиотеки, такие как GTK, уже упакованы (например, здесь: GTKD )

4 голосов
/ 03 ноября 2012

Популярной альтернативой является загрузка библиотеки во время выполнения. Вот пример того, как загрузить libpng и вызвать функцию libpng:

module libpngtest;

import std.stdio;
import core.sys.posix.dlfcn;

alias uint function() png_access_version_number_t;

int main() {
  auto lib = dlopen("libpng.so".ptr, RTLD_LAZY | RTLD_LOCAL);
  if (lib is null) {
    writeln("EEEK!");
    writeln(to!string(dlerror()));
    return -1;
  } else {
    writeln("WOOT!");
    auto png_access_version_number = cast(png_access_version_number_t)dlsym(lib, "png_access_version_number");
    writeln(png_access_version_number());
  }

  if (dlclose(lib) == 0) {
    return 0;
  } else {
    return -1;
  }
} // main() function

// compile: dmd libpngtest.d -L-ldl
// run:     ./libpngtest

Используйте DPaste для проверки: http://www.dpaste.dzfl.pl/917bc3fb

4 голосов
/ 27 октября 2009

D-код может быть связан с объектными файлами C и может взаимодействовать с C-DLL, но вам нужно будет сгенерировать модуль D из заголовочного файла C, который вы хотите использовать. На официальном веб-сайте D есть руководство , чтобы сделать то же самое.

1 голос
/ 08 апреля 2012

Вам нужно написать привязки C. Этот ответ объясните как.

0 голосов
/ 27 ноября 2009

Взгляните на http://dsource.org Есть много проектов, которые могут помочь вам начать с

...