Как использовать статические библиотеки C в D? - PullRequest
5 голосов
/ 24 ноября 2011

Я полностью озадачен тем, как получить FreeType 2.4.8, скомпилированный как статическая библиотека, и использовать его из моего приложения D в Windows.Я попытался запустить его с помощью objconv, coff2omf, и попытался extern(C) / extern(System), и т. Д., Но ничего не работает.Я получаю символ не найденные ошибки, нарушения доступа и просто кучу бесполезных ошибок.

Как я могу обойти это?Правильно ли я использую pragma lib для ссылки на мои статические библиотеки и как мне надежно конвертировать статические библиотеки COFF в OMF, которые может использовать DMD / Optlink?

РЕДАКТИРОВАТЬ: Некоторые примерычто я пытался сделать:

  1. Компиляция исходного кода FreeType с VS 2010 в виде статической библиотеки, компоновка в моем D-коде с помощью Pragma lib.(Возвращается ошибка типа «неизвестный формат библиотеки»)
  2. То же, что и выше, но преобразование в формат OMF с использованием objconv и затем попытка связать с прагмой lib.(Успешно скомпонован, но все еще не может вызывать функции.)
  3. Скомпилировал DLL из источника FreeType, запустил ее через implib для создания библиотеки импорта, попытался связать с pragma lib.(Связано успешно, но невозможно вызвать какие-либо функции из-за ошибок «попытка доступа к привилегированной функции» или «нарушение прав доступа»)
  4. Я попытался определить прототипы функций как все: extern (System), extern (В) и extern (винда).Первый и третий искажают имена функций внешних функций, так что они не соответствуют статическим библиотекам, а второй компилируется, но я получаю нарушения доступа во время выполнения, когда я на самом деле пытаюсь вызвать функции.

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

Ответы [ 2 ]

1 голос
/ 26 ноября 2011

Я почти уверен, что у Derelict2 есть привязки FreeType: http://www.dsource.org/projects/derelict (см. DerelictFT).

0 голосов
/ 24 ноября 2011

Да, вам понадобится extern (System) в ваших .d файлах с объявлениями функций FT. Статическая библиотека коллекция объектных файлов. Так что нет необходимости в каком-либо преобразовании (omf2coff и т. Д.). DMD принимает статические библиотеки в качестве аргументов, поэтому простой dmd file1.d file2.d C:/path/to/freetype.lib должен работать.

Edit:

Я был не прав. По-видимому, мне нужно было прочитать некоторую документацию о COFF2OMF . Цитата: Формат Microsoft COFF явно изменился в Visual C ++ 6.0. Чтобы использовать coff2omf для файла .lib с более новым форматом, используйте компоновщик Microsoft для преобразования файла в более ранний формат COFF :

link /lib /convert freetype.lib

Итак, судя по приведенному выше утверждению, необходимо выполнить 2 шага.

  1. Сначала используйте компоновщик Microsoft для преобразования статической библиотеки, созданной вами с помощью VisualStudio (в формате COFF), в старый COFF формат, как описано выше.

  2. Теперь выполните coff2omf freetype.lib для преобразования статической библиотеки в формат OMF.

  3. Теперь он должен быть готов к использованию с DMD, как описано в моем посте.

...