Russian Qt Forum
Октябрь 16, 2018, 03:47 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Собрать Си-библиотеку mimeTeX с Qt-программой  (Прочитано 500 раз)
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 734



Просмотр профиля WWW
« : Июль 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
#define MY_EXPORT __declspec(dllexport)
#else
#define MY_EXPORT
#endif
MY_EXPORT int CreateGifFromEq ( char *expression, char *gifFileName );

По сути, вызывать из этой библиотеки мне нужно только одну функцию CreateGifFromEq().

Qt-проект у меня состоит из двух под-проектов: библиотека mimetex и собственно сама программа:

Код:
TEMPLATE = subdirs
 
SUBDIRS = mimetex app

app.file = app/app.pro
app.depends = mimetex

mimetex.file = thirdParty/mimetex/mimetex.pro

Библиотека mimetex компилится в файл mimetex.a. С ворнингами, но компилится.

А при сборке подпроекта приложения возникает две проблемы:

Так как из C++ - кода инклюдится Си-заголовок mimetex.h, то в нем вылазит много ошибок, типа:

Код:
In file included from ../../programm/app/src/main.cpp:2:0:
../../programm/app/src/../../thirdParty/mimetex/mimetex.h:267:12: error: expected identifier before ‘;’ token
   int class;    /* e.g., 3=relation, TexBook pg.154*/
            ^
../../programm/app/src/../../thirdParty/mimetex/mimetex.h:267:12: error: multiple types in one declaration
../../programm/app/src/../../thirdParty/mimetex/mimetex.h:267:12: error: declaration does not declare anything [-fpermissive]
../../programm/app/src/../../thirdParty/mimetex/mimetex.h:319:61: error: expected identifier before ‘;’ token
 STATIC struct {char *name; int family; int istext; int class;}
                                                             ^
../../programm/app/src/../../thirdParty/mimetex/mimetex.h:319:61: error: multiple types in one declaration
../../programm/app/src/../../thirdParty/mimetex/mimetex.h:319:61: error: declaration does not declare anything [-fpermissive]
../../programm/app/src/../../thirdParty/mimetex/mimetex.h:337:34: error: too many initializers for ‘<anonymous struct>’
     {  NULL,    0,       0,  0 } }
                                  ^
../../programm/app/src/../../thirdParty/mimetex/mimetex.h:337:34: error: too many initializers for ‘<anonymous struct>’

Я обошел это так. В приложении есть дефайн APPLICATION_NAME. Весь код mimetex.h (за исключение экспорта функции CreateGifFromEq) я оборачиваю конструкцией:

Код:
#ifndef APPLICATION_NAME
...
#endif

В результате, когда собирается подпроект библиотеки mimetex, этого дефайна в коде нет, и библиотека собирается. А когда mimetex.h подключается из приложения, в mimetex.h остаются только директивы экспорта функции CreateGifFromEq(). Но на этапе линковки приложения все равно эта функция не видна:

Код:
build/main.o: In function `main':
Makefile:246: recipe for target 'bin/programm' failed
make[1]: Leaving directory '/media/wd_640_part_2/home64bit/xi/work/develop/cpp/ProgrammWithMimetex/build-build-Desktop_Qt_5_10_1_GCC_64bit-Debug/app'
Makefile:70: recipe for target 'sub-app-app-pro-make_first' failed
/media/wd_640_part_2/home64bit/xi/work/develop/cpp/ProgrammWithMimetex/build-build-Desktop_Qt_5_10_1_GCC_64bit-Debug/app/../../programm/app/src/main.cpp:12: undefined reference to `CreateGifFromEq(char*, char*)'
collect2: error: ld returned 1 exit status
make[1]: *** [bin/programm] Error 1

Вот. Мне нужно сделать две вещи.

Минимум: заставить компилиться проект приложения и делать вызов фукции CreateGifFromEq()

Максимум: настроить подпроект mimetex.pro так, чтобы не лезли варнинги. Если mimetex компилить прямой командой:
Код:
gcc -DAA mimetex.c gifsave.c -lm -o mimetex
то варнингов нет.


Готовый минимальный пример: http://rgho.st/6YP2gjCHq
Записан

Собираю информацию по крупицам
http://webhamster.ru
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4024



Просмотр профиля WWW
« Ответ #1 : Июль 15, 2018, 21:10 »

Цитировать
Так как из C++ - кода инклюдится Си-заголовок mimetex.h, то в нем вылазит много ошибок
а инклудить внутри extern "C" не помогает?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
alex312
Программист
*****
Offline Offline

Сообщений: 557



Просмотр профиля
« Ответ #2 : Июль 16, 2018, 11:48 »

Если собирать статику, то
Код:
#define MY_EXPORT __declspec(dllexport)
- это лишнее.
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 734



Просмотр профиля WWW
« Ответ #3 : Июль 28, 2018, 17:38 »

Цитировать
Так как из C++ - кода инклюдится Си-заголовок mimetex.h, то в нем вылазит много ошибок
а инклудить внутри extern "C" не помогает?
Разобрались вот здесь:

https://www.linux.org.ru/forum/development/14348119

Но потом, оказалось, что mimetex использовать как библиотеку не получится, потому что там такой Си-код, который срабатывает только один раз (потому что программа консольная, берет данные из исходного файла, записывает в выходной файл, и потом завершается). И поэтому там не предусмотрен переинит всех глобальных переменных чтобы запустить код второй раз. А там куча глобальных переменных, около полусотни. Поэтому при втором запуске основной функции происходит сегфолт.
Записан

Собираю информацию по крупицам
http://webhamster.ru
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Страница сгенерирована за 0.043 секунд. Запросов: 22.