как использовать разделяемую библиотеку из haskell без заголовочного файла?

У меня есть библиотека pdflib_py.so, которую я хочу вызвать из haskell. У меня нет заголовочного файла. И, как вы можете видеть, имя библиотеки не в стандартной форме libbla.

Как мне получить к нему доступ из haskell?

Я следовал учебнику c2hs. Но для этого требуется заголовочный файл (которого у меня нет), а ghc требует, чтобы имя библиотеки было в формате libbla. Я мог бы, конечно, переименовать pdflib_py.so в libpdfpy.so, на самом деле я пробовал (это не сработало), но глупо предполагать, что вы не можете получить доступ к библиотеке из haskell из-за ее имени. Я определенно что-то здесь упускаю.

Вы можете загрузить библиотеку pdflib отсюда http://www.pdflib.com/download/pdflib-family/pdflib-8/

У них есть пакеты для c++, java, php, python и т. д.

Почему я использую не библиотеку С++, а библиотеку Python? Что ж, библиотека C++ libbpdf.a требует компиляции с помощью g++. И haskell не работает с g++, мне пришлось бы сначала написать оболочку C. К счастью, кто-то уже сделал это за меня. Вот что такое pdflib_py.so - оболочка c над библиотекой libpdf.

Итак, как мне использовать библиотеку с нестандартным именем и без заголовочного файла от haskell?


person Vagif Verdi    schedule 15.04.2012    source источник


Ответы (1)


Я не считаю ваш подход правильным. Вы должны скомпилировать pdflib с g++ в разделяемую библиотеку, а затем связать ее. Библиотека C++, которую они предоставляют, уже использует оболочку «extern C», поэтому экспортируемые символы будут точно такими, как вы ожидаете.

Подводя итог, предлагаю следующее решение:

  1. Загрузить пакет C++
  2. Скомпилируйте с помощью g++, чтобы создать общую библиотеку .so
  3. Используйте файл заголовка .h из пакета, чтобы сделать привязки Haskell
  4. Связать код Haskell с библиотекой .so
person Tener    schedule 15.04.2012
comment
Я скомпилировал с помощью этой команды: g++ -shared -fPIC -o libpdf.so libpdf.a И затем получил кучу ошибок связывания: dist/build/hello/hello-tmp/Main.o: In function s4lT_info': (.text+0x2fd): undefined reference to PDF_delete'... - person Vagif Verdi; 16.04.2012
comment
Спасибо, это сработало. Правильная команда была: - person Vagif Verdi; 16.04.2012