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
相关产品推荐
相关产品推荐

