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
передается компоновщику, но не имеет никакого эффекта.