Имеется широко известный в узких кругах проект 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