Я пытаюсь кросс-компилировать VLC (от Linux до Windows) с поддержкой gnutls, которая, в свою очередь, использует libgmp. Я получаю ошибки связывания для нескольких определений символов в libgmp (___gmpz_abs), например, среди бесчисленного множества других). Я, в свою очередь, проследил это до того, что libgnutls.a имеет несколько определений одного и того же символа из-за того, что объектные файлы в gnutls имеют свои собственные определения функций gmp. Множественно определенные функции — это те, которые libgmp пытается проделать с инлайнингом.
Насколько я могу судить, существует множество вариаций встраивания между разными компиляторами, стандартами и платформами. Похоже, что libgmp пытается использовать макросы, чтобы справиться со всем этим должным образом, но терпит неудачу. Конечным результатом являются встроенные функции, определенные в gmp.h, которые копируются в каждый объектный файл в gnutls, который их использует. Я просмотрел фактические командные строки компилятора, с которыми вызывается mingw для создания этих объектных файлов, и я не вижу в этом ничего плохого:
libtool: compile: i686-w64-mingw32-gcc -std=gnu99 -DHAVE_CONFIG_H -I. -I../.. -I./../../gl -I./../../gl -I./../includes -I./../includes -I./../../gl -I./.. -I./../minitasn1 -I/home/jeremy/vlc/contrib/i686-w64-mingw32/include -I/home/jeremy/vlc/contrib/i686-w64-mingw32/include -g -c mpi.c -o mpi.o
в частности -std=gnu99 был предложен как решение подобных проблем в других местах в Интернете, но, очевидно, это уже используется по умолчанию.
Неясно, чья это вина, mingw's libtool's gnutls's или gmp's
Мне нужен ответ на вопрос: какие флаги или параметры мне нужно настроить или сделать с помощью gnutls, чтобы определения встроенных функций правильно обрабатывались?