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

MinGW编译的C++目录遍历程序在PowerShell/CMD中无输出问题

MSYS2 UCRT64编译的C++目录遍历程序在PowerShell/CMD无输出问题

问题详情

我用以下代码实现遍历并输出当前目录下的文件:

#include <filesystem>
#include <iostream>

using namespace std::filesystem;

int main() {
    for (directory_iterator next("."), end; next != end; ++next) {
        std::cout << next->path() << std::endl;
    }
    return 0;
}

编译命令为 g++ demo.cpp -o demo.exe,使用的编译器路径是 C:\msys64\ucrt64\bin\g++.exe。

运行差异

  • MSYS2 Bash环境:运行正常,输出如下:
$ ./demo.exe
".\.clangd"
".\.vscode"
".\demo.cpp"
".\demo.exe"
  • PowerShell/CMD环境:无任何输出,执行后直接返回:
PS C:\Users\cnjawi> .\demo.exe
PS C:\Users\cnjawi>

进一步测试

仅输出测试文本的代码在PowerShell/CMD中能正常运行:

#include <filesystem>
#include <iostream>

using namespace std::filesystem;

int main() {
    std::cout << "test\n";
    return 0;
}

但一旦加入目录遍历代码块,连开头的test都无法输出:

#include <filesystem>
#include <iostream>

using namespace std::filesystem;

int main() {
    std::cout << "test\n";
    for (directory_iterator next("."), end; next != end; ++next) {
        std::cout << next->path() << std::endl;
    }
    return 0;
}

问题原因

MSYS2 UCRT64环境编译的程序默认依赖MSYS2的运行时库,在原生Windows终端(PowerShell/CMD)中,程序初始化directory_iterator时会因为找不到依赖的运行时组件直接崩溃退出,导致前面的cout输出还没来得及刷新到控制台就终止了。

解决方法

1. 静态编译程序

编译时添加静态链接参数,将依赖库打包进可执行文件,摆脱对MSYS2运行时的依赖:

g++ demo.cpp -o demo.exe -static

也可以单独针对标准库静态链接:

g++ demo.cpp -o demo.exe -static-libstdc++ -static-libgcc

2. 加载MSYS2运行时路径

在PowerShell/CMD中先将MSYS2 UCRT64的bin目录加入环境变量,再运行程序:

$env:Path += ";C:\msys64\ucrt64\bin"
.\demo.exe

3. 使用Windows原生编译器

如果不需要MSYS2的特定特性,改用Visual Studio的MSVC编译器编译,生成的可执行文件可直接在PowerShell/CMD中正常运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 23:30:53