Подтвердить что ты не робот

Как использовать библиотеку C из D?

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

Популярной альтернативой является загрузка библиотеки во время выполнения. Ниже приведен пример загрузки 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

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

Ответ 5

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