Кросс-компиляция gmp с mingw-w64: встраивание и несколько определений

Я пытаюсь кросс-компилировать 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, чтобы определения встроенных функций правильно обрабатывались?


person Jeremy Salwen    schedule 20.02.2013    source источник


Ответы (2)


Предполагается, что эти функции встроены, но вы, похоже, собрали библиотеку с отключенной оптимизацией, поэтому встраивания нет.

Попробуйте еще раз с -O2 при компиляции (и компоновке).

person ams    schedule 04.03.2013

Я не могу дать вам положительный ответ, но, возможно, это может вам помочь. Из руководства GCC...

Обратите внимание, что некоторые варианты использования в определении функции могут сделать ее непригодной для встроенной подстановки. Среди этих применений: функции с переменным числом переменных, использование alloca, использование типов данных переменной длины (см. Переменная длина), использование вычисляемого перехода (см. Метки как значения), использование нелокального перехода и вложенных функций (см. Вложенные функции). Использование -Winline предупреждает, когда встроенная функция не может быть заменена, и указывает причину сбоя.

В любом случае стоит прочитать чей раздел о встроенных функциях.

http://gcc.gnu.org/onlinedocs/gcc/Inline.html

person jpmuc    schedule 05.03.2013
comment
использование -Winline, по-видимому, указывает на то, что все функции, помеченные как встроенные, заменяются правильно. По крайней мере, он не выводит никаких предупреждений или сообщений. - person Jeremy Salwen; 30.03.2013