Название: Собрать Си-библиотеку mimeTeX с Qt-программой Отправлено: xintrea от Июль 15, 2018, 19:25 Имеется широко известный в узких кругах проект mimetex - минималистичный генератор картинок формул на основе языка разметки TeX. Его сайт:
http://www.forkosh.com/mimetex.html (в настоящий момент опять лег) Зато последняя версия аккуратно сохранена у автора MyTetra: https://webhamster.ru/mytetrashare/index/mtb0/15315568717nedxk2nkx В архиве mimetex.zip есть документация по компиляции. * * * Задача в том, чтобы собрать Qt-программу со статической библиотекой, полученной из mimetex (исходники mimetex оформлены как программа, а не как библиотека). Для того, чтобы получить статическую библиотеку mimetex, я сделал следующее: А. Заменил в mimetex.c все определения и вызовы функции main() на mimetexMain(). Б. В файл mimetex.h добавил: Код: #ifdef Q_OS_WIN По сути, вызывать из этой библиотеки мне нужно только одну функцию CreateGifFromEq(). Qt-проект у меня состоит из двух под-проектов: библиотека mimetex и собственно сама программа: Код: TEMPLATE = subdirs Библиотека mimetex компилится в файл mimetex.a. С ворнингами, но компилится. А при сборке подпроекта приложения возникает две проблемы: Так как из C++ - кода инклюдится Си-заголовок mimetex.h, то в нем вылазит много ошибок, типа: Код: In file included from ../../programm/app/src/main.cpp:2:0: Я обошел это так. В приложении есть дефайн APPLICATION_NAME. Весь код mimetex.h (за исключение экспорта функции CreateGifFromEq) я оборачиваю конструкцией: Код: #ifndef APPLICATION_NAME В результате, когда собирается подпроект библиотеки mimetex, этого дефайна в коде нет, и библиотека собирается. А когда mimetex.h подключается из приложения, в mimetex.h остаются только директивы экспорта функции CreateGifFromEq(). Но на этапе линковки приложения все равно эта функция не видна: Код: build/main.o: In function `main': Вот. Мне нужно сделать две вещи. Минимум: заставить компилиться проект приложения и делать вызов фукции CreateGifFromEq() Максимум: настроить подпроект mimetex.pro так, чтобы не лезли варнинги. Если mimetex компилить прямой командой: Код: gcc -DAA mimetex.c gifsave.c -lm -o mimetex Готовый минимальный пример: http://rgho.st/6YP2gjCHq Название: Re: Собрать Си-библиотеку mimeTeX с Qt-программой Отправлено: kambala от Июль 15, 2018, 21:10 Цитировать Так как из C++ - кода инклюдится Си-заголовок mimetex.h, то в нем вылазит много ошибок а инклудить внутри extern "C" не помогает?Название: Re: Собрать Си-библиотеку mimeTeX с Qt-программой Отправлено: alex312 от Июль 16, 2018, 11:48 Если собирать статику, то
Код: #define MY_EXPORT __declspec(dllexport) Название: Re: Собрать Си-библиотеку mimeTeX с Qt-программой Отправлено: xintrea от Июль 28, 2018, 17:38 Цитировать Так как из C++ - кода инклюдится Си-заголовок mimetex.h, то в нем вылазит много ошибок а инклудить внутри extern "C" не помогает?https://www.linux.org.ru/forum/development/14348119 Но потом, оказалось, что mimetex использовать как библиотеку не получится, потому что там такой Си-код, который срабатывает только один раз (потому что программа консольная, берет данные из исходного файла, записывает в выходной файл, и потом завершается). И поэтому там не предусмотрен переинит всех глобальных переменных чтобы запустить код второй раз. А там куча глобальных переменных, около полусотни. Поэтому при втором запуске основной функции происходит сегфолт. |