使用string类型的C++程序未加-static-libstdc++编译无法运行如何解决
问题根本原因
这个问题本质是MinGW运行时动态库版本冲突,触发逻辑如下:
- 用到
std::string的C++程序编译后,运行时需要加载对应版本的libstdc++-6.dll动态库 - Code::Blocks启动程序时,会自动将自身绑定的MinGW的bin目录加入临时环境变量优先读取,所以不会触发冲突
- 你在系统CMD中直接运行exe时,系统会按照PATH环境变量的顺序查找dll,如果你电脑里其他软件(比如带MinGW运行时的第三方工具、游戏、其他开发套件)在PATH更靠前的位置放置了版本不匹配的
libstdc++-6.dll,就会因为接口不兼容导致程序启动失败、无响应或者报错。
重装MinGW无法解决问题的原因是,重装不会修改系统PATH的优先级顺序,冲突的第三方dll仍然会被优先加载。
验证方法
打开CMD执行命令:where libstdc++-6.dll
如果输出的第一个路径不是你当前使用的MinGW的bin目录,即可确认是该问题。
解决方案(无需每次编译加静态链接参数)
- 方案1(最推荐):打开系统环境变量设置,将你当前使用的MinGW的bin目录移动到PATH列表的最顶部,修改完成后重启CMD即可生效,后续编译运行的程序都会优先加载对应版本的动态库。
- 方案2:每次编译完成后,将MinGW bin目录下的
libstdc++-6.dll、libgcc_s_seh-1.dll(64位MinGW)、libwinpthread-1.dll拷贝到生成的exe同级目录,程序运行时会优先读取同目录下的动态库,避免全局路径冲突。 - 方案3:给g++设置全局别名,CMD中执行
doskey g++=g++ -static-libstdc++ -static-libgcc $*即可临时生效,如需永久生效可以将该命令写入CMD的自动启动脚本。
内容的提问来源于stack exchange,提问作者Scardus
相关产品推荐
相关产品推荐

