You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用MSYS2 UCRT64 G++的CMake无法编译含iostream的文件

问题解决方案

1. UCRT64链接错误(collect2.exe: ld返回116)

这个错误核心是UCRT64的libstdc++与通用CRT(UCRT)的兼容性问题,或是CMake未正确识别UCRT64的标准库路径:

  • 给CMakeLists.txt明确指定C++标准,比如添加:set(CMAKE_CXX_STANDARD 17)(根据你的代码需求调整版本)
  • 在CMake配置中手动指定链接标准库,追加:set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lstdc++")
  • 检查环境变量,运行where g++和where ld确认路径是UCRT64目录下的,避免和其他MinGW版本路径冲突

2. MinGW64下cout失效/程序异常退出

这是典型的C/C++ IO缓冲区不同步,加上MinGW64旧版libstdc++的IO初始化bug导致的:

  • 若必须混用printf和cout,在程序开头添加:
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(nullptr);
    
    关闭C/C++ IO同步并解绑cin与cout,避免缓冲区冲突
  • 检查cout输出是否未刷新缓冲区,比如cout << "test";改成cout << "test" << endl;或cout << "test" << std::flush;,未刷新的缓冲区会导致输出被滞留,看起来像是失效
  • 更新MinGW64到最新版本,通过MSYS2执行pacman -S mingw-w64-x86_64-gcc即可,旧版libstdc++存在IO相关的遗留bug

通用排查步骤

  • 确认CMakeLists.txt结构正确,示例模板:
    cmake_minimum_required(VERSION 3.20)
    project(YourProject)
    set(CMAKE_CXX_STANDARD 17)
    add_executable(YourExe main.cpp)
    
  • 删除build目录清理CMake缓存,重新配置构建,避免旧配置残留干扰
  • 检查main函数是否有return 0;,未正确返回会导致程序异常终止

内容的提问来源于stack exchange,提问作者Max Kalentsov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 23:29:53