libtool: ошибка: не удается создать разделяемую библиотеку x86_64-w64-mingw32, если не указано -no-undefined

makefile #c 17 #mingw #msys #openfst

#makefile #c 17 #mingw #msys #openfst

Вопрос:

Я пытаюсь собрать и установить библиотеку OpenFST на windows10, используя MINGW64 с Msys, но во время сборки с помощью make я получил следующую ошибку. Я впервые использовал эту команду:

  ./configure --enable-grm --enable-far --enable-ngram-fsts MAKE="mingw32-make"
 

некоторые результаты проверки этой команды не генерируют:

 checking whether we are cross compiling... no
checking for sysroot... no
checking for a working dd... ./configure: line 7016: cmp: command not found
./configure: line 7016: cmp: command not found
checking for mt... no
checking if : is a manifest tool... no
checking for unistd.h... no
checking if gcc supports -fno-rtti -fno-exceptions... ./configure: line 8930: diff: command `not found`
checking whether to build static libraries... no
 

Другие результаты проверки в порядке и да. Затем я использовал команду make:

 mingw32-make
 

это работает для некоторых файлов, которые затем завершаются этой ошибкой:

 libtool:   error: can't build x86_64-w64-mingw32 shared library unless -no-undefined is 
specified
 

Я впервые создаю с помощью MinGW. Итак, я не знаю, что означает ошибка, и если в результате проверки «нет» из конфигурации, ответственной за это.

Комментарии:

1. diff Работает ли команда? Возможно, вам потребуется ее установить. Кроме того, вы должны использовать make вместо mingw32-make .

2. @HolyBlackCat Нет, diff не работает. а также make не работает, но «mingw32-make» выполняет ту же работу. в чем разница между ними?

3. make является полноценным Make (использует вилку Cygwin от MSYS2). mingw32-make это попытка перенести Make в Windows без Cygwin, он использует cmd вместо sh как оболочку, и поскольку большинство make-файлов этого не ожидают, не все из них работают с ним. В прошлый раз, когда я пробовал, это тоже было довольно глючно.

4. «разница не работает. а также сделать не работает» Вам нужно установить оба.

5. @HolyBlackCat Я установил их оба и использовал make вместо mingw32-make , но ошибка все еще появляется.

Ответ №1:

Это нормально.

MinGW не позволяет создавать разделяемые библиотеки (DLL), когда все еще есть неразрешенные символы, потому что в Windows каждый символ, на который ссылается DLL, должен указывать на что-то существующее. На других платформах это не всегда требуется.

Поэтому вы должны перейти к -Wl,-no-undefined to gcc при связывании.

Для проектов, использующих autoconf configure , это обычно уже делается, если это была достаточно последняя версия autoconf. В противном случае вам может потребоваться добавить LDFLAGS="-Wl,-no-undefined" в строку configure . Если это не поможет, вы можете попытаться изменить его в libtool файле, сгенерированном configure .

Поэтому, в частности, вы можете попробовать это в оболочке MSYS / MSYS2:

 ./configure LDFLAGS="-Wl,-no-undefined"
 

и если это не сработает, вы также можете попробовать это (после configure команды и перед запуском make ):

 sed -i.bak -e "s/(allow_undefined=)yes/1no/" libtool
 

Другие инструменты сборки, такие как cmake, meson или scons, уже знают, как создавать библиотеки DLL Windows, и не нуждаются в специальной обработке.

Комментарии:

1. Большое вам спасибо, я попробую

2. Я столкнулся с той же проблемой, также с OpenFST, и только sed работал. -Wl,-no-undefined передается компоновщику, но не имеет никакого эффекта.