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

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

我正在尝试使用 MINGW64 和 Msys 在 windows10 上构建和安装 OpenFst 库,但在使用 make 构建期间出现以下错误。我第一次使用这个命令:

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

此命令的一些检查结果生成 no:

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 进行构建。所以,我不知道错误是什么意思,也不知道是否从负责它的配置中检查结果为“否”。

这是正常的。

MinGW 不允许在仍有未解析的符号时构建共享库 (DLL),因为在 Windows 从 DLL 引用的每个符号都必须指向存在的内容。在其他平台上,这并不总是必需的。

所以你应该在链接时传递给-Wl,-no-undefinedgcc

对于使用 autoconf 的 configure 的项目,如果它是足够新的 autoconf 版本,通常已经完成了。否则,您可能需要将 LDFLAGS="-Wl,-no-undefined" 添加到配置行。 如果这没有帮助,您可以尝试在 configure.

生成的 libtool 文件中进行更改

具体来说,您可以在 MSYS/MSYS2 shell:

中尝试
./configure LDFLAGS="-Wl,-no-undefined"

如果这不起作用,您也可以尝试这个(在 configure 命令之后和 运行 make 之前):

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

其他构建工具,如 cmake、meson 或 scons 已经知道如何构建 Windows DLL,不需要特殊处理。