编译C++程序时libgcc_s_dw2-1.dll与libstdc++-6.dll缺失问题求助
解决MinGW编译C程序依赖libgcc_s_dw2-1.dll和libstdc-6.dll的问题
问题核心
你加了-static、-static-libgcc、-static-libstdc++参数仍提示缺失DLL,确实是因为所用的SFML和jsonCpp是动态库版本——动态库本身会绑定MinGW的运行时DLL,哪怕自己的代码静态链接了标准库,第三方动态库的依赖还是会被带进来。另外你Makefile里编译.o文件时加的静态参数完全多余,这些参数只在链接阶段生效。
解决步骤
1. 换用静态版第三方库
- 下载和你MinGW版本匹配的SFML静态包(注意32/64位、编译器版本对应),静态库文件名一般带
-s后缀,比如libsfml-graphics-s.a、libsfml-window-s.a、libsfml-system-s.a。 - jsonCpp要么找现成的静态库,要么自己用MinGW编译生成
libjsoncpp.a,编译时记得加-static-libgcc -static-libstdc++,保证它本身不依赖动态运行时。
2. 修正Makefile
把链接参数改成静态库,同时SFML静态链接需要额外添加系统依赖库:
rtx.exe: base.o objects.o rtx.o g++ -O3 base.o objects.o rtx.o -o rtx -pthread -Lsrc\lib \ -lsfml-graphics-s -lsfml-window-s -lsfml-system-s \ -ljsoncpp -static-libgcc -static-libstdc++ -static \ -lopengl32 -lfreetype -lwinmm -lgdi32 -lshell32 rtx.o: rtx.cpp g++ -Isrc\include -O3 -c rtx.cpp objects.o: objects.cpp objects.hpp g++ -Isrc\include -O3 -c objects.cpp base.o: base.cpp base.hpp g++ -Isrc\include -O3 -c base.cpp clean: -rm *.o rtx.exe
- 删掉了编译阶段多余的静态参数,只在链接阶段保留相关配置。
- SFML静态链接必须添加
opengl32、freetype等系统库,否则会出现链接错误。 -static放在参数最后,确保所有可静态链接的部分都被处理。
3. 验证结果
编译完成后,用objdump -x rtx.exe | grep DLL命令查看程序依赖的DLL,如果看不到libgcc_s_dw2-1.dll和libstdc++-6.dll,就说明静态链接成功了。
内容的提问来源于stack exchange,提问作者Leroy
相关产品推荐
相关产品推荐

