编译MinGW-w64(静态+共享模式)时出现-lgcc_s找不到错误求助
我在Windows系统上用Msys2编译MinGW-w64,已下载MinGW-w64与GCC-12.2.0源码,按照官方编译指南步骤操作。静态编译可成功生成正常程序,但同时启用静态与共享模式编译后,测试HelloWorld程序时出现如下错误:
c:/msys64/mingw32/bin/../lib/gcc/i686-w64-mingw32/12.2.0/../../../../i686-w64-mingw32/bin/ld.exe: cannot find -lgcc_s: No such file or directory
c:/msys64/mingw32/bin/../lib/gcc/i686-w64-mingw32/12.2.0/../../../../i686-w64-mingw32/bin/ld.exe: cannot find -lgcc_s: No such file or directory
collect2.exe: error: ld returned 1 exit status
我的配置命令如下:
../src/gcc/configure --prefix=/mingw32 --with-sysroot=/mingw32 --build=i686-w64-mingw32 --host=i686-w64-mingw32 --target=i686-w64-mingw32 --with-pkgversion='Built by Dahy Allam Ali' --enable-languages=c,c++ --enable-shared --enable-static --enable-libstdcxx-filesystem-ts --enable-libstdcxx-time --enable-threads=win32 --enable-plugins --enable-libatomic --enable-fully-dynamic-string --enable-checking=release --enable-version-specific-runtime-libs --enable-lto --enable-bootstrap --disable-multilib --disable-win32-registry --disable-sjlj-exceptions --disable-libstdcxx-pch --disable-libstdcxx-verbose --disable-rpath --disable-nls --disable-werror --with-arch=i686 --with-gnu-ld --with-gnu-as --with-boot-ldflags=-static-libstdc++ --with-stage1-ldflags=-static-libstdc++
解决方法
1. 检查共享库是否生成
先确认编译完成后,/mingw32/lib/gcc/i686-w64-mingw32/12.2.0/目录下是否存在libgcc_s.dll.a或libgcc_s.a文件。如果缺失,说明共享版本的libgcc未被正确编译生成。
2. 调整配置参数
- 移除
--enable-version-specific-runtime-libs:该参数会将运行时库安装到版本专属目录,可能导致链接器无法定位共享库。 - 确保
--enable-shared在--enable-static之前:部分场景下参数顺序会影响编译逻辑,优先启用共享模式有助于生成完整的共享库文件。
修改后的配置命令示例:
../src/gcc/configure --prefix=/mingw32 --with-sysroot=/mingw32 --build=i686-w64-mingw32 --host=i686-w64-mingw32 --target=i686-w64-mingw32 --with-pkgversion='Built by Dahy Allam Ali' --enable-languages=c,c++ --enable-shared --enable-static --enable-libstdcxx-filesystem-ts --enable-libstdcxx-time --enable-threads=win32 --enable-plugins --enable-libatomic --enable-fully-dynamic-string --enable-checking=release --enable-lto --enable-bootstrap --disable-multilib --disable-win32-registry --disable-sjlj-exceptions --disable-libstdcxx-pch --disable-libstdcxx-verbose --disable-rpath --disable-nls --disable-werror --with-arch=i686 --with-gnu-ld --with-gnu-as --with-boot-ldflags=-static-libstdc++ --with-stage1-ldflags=-static-libstdc++
3. 手动复制共享库到指定路径
如果编译后libgcc_s.dll.a存在于编译临时目录,可手动将其复制到/mingw32/lib/gcc/i686-w64-mingw32/12.2.0/和/mingw32/i686-w64-mingw32/lib/目录,同时将libgcc_s.dll复制到/mingw32/bin/目录。
4. 禁用bootstrap重新编译
--enable-bootstrap的多阶段编译可能导致共享库生成不完整,尝试移除该参数后重新配置编译:
../src/gcc/configure --prefix=/mingw32 --with-sysroot=/mingw32 --build=i686-w64-mingw32 --host=i686-w64-mingw32 --target=i686-w64-mingw32 --with-pkgversion='Built by Dahy Allam Ali' --enable-languages=c,c++ --enable-shared --enable-static --enable-libstdcxx-filesystem-ts --enable-libstdcxx-time --enable-threads=win32 --enable-plugins --enable-libatomic --enable-fully-dynamic-string --enable-checking=release --enable-version-specific-runtime-libs --enable-lto --disable-bootstrap --disable-multilib --disable-win32-registry --disable-sjlj-exceptions --disable-libstdcxx-pch --disable-libstdcxx-verbose --disable-rpath --disable-nls --disable-werror --with-arch=i686 --with-gnu-ld --with-gnu-as --with-boot-ldflags=-static-libstdc++ --with-stage1-ldflags=-static-libstdc++
内容的提问来源于stack exchange,提问作者Mr. Green

