Написание привязки D (D2) для существующих библиотек C - PullRequest
6 голосов
/ 04 сентября 2010

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

Я планирую сделать это для D2 (не специально для D1, но если это может быть для обоих, даже лучше). Я использую компилятор DMD2.

  • Какие условные обозначения следует использовать (я заметил операторы версий, псевдонимы и определения регулярных констант / функций)?
  • Какая разница между связыванием со статической библиотекой (и, следовательно, связанной с ней) или динамической библиотекой? Есть ли разница в привязке?
  • Для связывания статической библиотеки компилятор DMD, похоже, не принимает файлы .a или .o, только .lib и .obj. Означает ли это, что библиотеки должны быть скомпилированы с помощью компилятора DMC (в отличие от компилятора GCC), а затем связаны через компилятор DMD?

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

Спасибо!

Ответы [ 2 ]

4 голосов
/ 04 сентября 2010

Несколько замечаний:

  1. DMD и его компоновщик Optlink работают со старым форматом объектных файлов OMF, а не с COFF. Это означает, что файлы C, на которые вы ссылаетесь, также должны быть OMF. Если вы не хотите использовать DMC, есть инструменты, которые преобразуют COFF в OMF, хотя я не знаю подробностей о них.

  2. Что касается перевода файлов .h в файлы .d, утилита htod поставляется с DMD и будет выполнять этот перевод для вас, хотя и с некоторыми недостатками, если вы серьезно злоупотребляете препроцессором. Обычно вы используете const, immutable или enum для констант манифеста, операторы version для условной компиляции и обычные (возможно, шаблонные) функции для макрофункций.

Что касается примеров, одним местом для поиска было бы время выполнения, , которое содержит привязки для всей стандартной библиотеки языка C.

1 голос
/ 10 сентября 2010

Вы можете посмотреть, как Aldacron поступает с Derelict2 .

...