C++ std::thread代码在项目目录编译运行时找不到入口点崩溃
问题原因
这是Windows下动态库加载优先级导致的版本不匹配问题,和你写的代码本身没有任何关系。
Windows加载EXE依赖的DLL时,会优先搜索EXE所在的当前目录,再去搜索系统路径、环境变量里的路径。你项目目录里存放的SFML、jsonCpp依赖自带了旧版本的MinGW运行时DLL(libstdc++-6.dll、libwinpthread-1.dll、libgcc_s_seh-1.dll),这些DLL是用和你当前g版本不一致的编译器编译的,里面的std::thread相关导出符号和你编译生成的EXE要找的符号对不上,就会弹出找不到程序入口点的报错。
空白目录下没有这些旧版本DLL,系统会自动加载你g安装路径下和当前编译器版本完全匹配的运行时DLL,所以程序可以正常运行。
解决方法
按以下步骤操作即可修复:
- 打开命令提示符执行
where g++,拿到你当前使用的g++程序的完整路径,进入该路径同级的bin目录,找到以下三个文件:libgcc_s_seh-1.dll(如果你的MinGW是sjlj异常处理版本,对应文件名是libgcc_s_sjlj-1.dll)libstdc++-6.dlllibwinpthread-1.dll
- 把这三个文件复制到你项目里生成EXE的目录,覆盖目录下已有的同名DLL文件
- 重新运行EXE即可正常执行,不会再出现入口点找不到的弹窗
可选优化方案
如果你不想每次都手动复制运行时DLL,可以在编译时添加静态链接参数,把C/C++运行时、线程库直接静态编译进EXE文件,就不会受目录下其他第三方DLL的版本影响,编译命令参考:
g++ -std=c++17 -o test test.cpp -pthread -static-libstdc++ -static-libgcc
另外注意你之前用的-std=c++0x是C11的早期实验性支持参数,现在建议替换为-std=c++17或更新的标准版本,标准库线程实现的稳定性更好。后续引入第三方预编译C库时,尽量保证第三方库的编译环境和你本地的MinGW大版本一致,否则还会出现类似的符号不匹配、运行时崩溃问题。
内容的提问来源于stack exchange,提问作者Leroy
相关产品推荐
相关产品推荐

