无法在 Mingw 中编译共享库,编译器看不到系统库

Can't compile shared library in Mingw, compiler doesn't see system library

我在 Windows

中尝试使用 MinGW (msys2) 编译开源库时收到此警告
*** Warning: linker path does not have real file for library -lcrypt32.
*** I have the capability to make that library automatically link in when
*** you link to this library.  But I can only do this if you have a
*** shared version of the library, which you do not appear to have
*** because I did check the linker path looking for a file starting
*** with libcrypt32 and none of the candidates passed a file format test
*** using a file magic. Last file checked: C:/msys64/mingw32/i686-w64-mingw32/lib/libcrypt32.a

由于这个错误,我无法仅静态编译共享库。

文件C:/msys64/mingw32/i686-w64-mingw32/lib/libcrypt32.a存在并且正常链接在相同环境下的另一个库中

警告消息由 libtool 显示,以防找不到合适的候选库进行链接。就我而言,问题的根源是我的语言环境。已安装 libtool 使用 objdump 的输出来检查找到的候选对象是否为导入库并期望以英文输出:

    if eval $OBJDUMP -f  | $SED -e '10q' 2>/dev/null |
       $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64|coff-arm|coff-arm64|coff-i386|coff-x86-64)' >/dev/null; then

所以在创建库之前将语言设置为英语解决了我的问题:LANG=en_US.UTF-8 make

您尝试构建的开源项目可能有一个旧的 configure 脚本,该脚本生成的 libtool 对于 Windows(或 Windows 64 位,以防万一您正在为此而构建)。

运行 autoreconf 是确保您拥有更新的 configure 脚本的可能解决方案。一些来源还包括某种 bootstrap 脚本。

我见过其他情况,因为缺少链接器标志 -Wl,-no-undefined,导致构建共享库 (DLL) 失败。这有时可以通过 运行:

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