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

MinGW编译C++17 <filesystem>程序无法在其他Win10电脑运行

问题现象
  • 编译环境:Windows 10 + MinGW g++ 9.2.0(g++.exe (MinGW.org GCC Build-2) 9.2.0)
  • 需求:编译出的exe可在未安装MinGW或任何C++编译器的Win10设备上直接运行
  • 异常表现:常规C程序随exe分发第三方dll即可正常跨设备运行,但使用C17 <filesystem>标准库的程序仅能在编译机正常运行,拷贝到其他Win10设备启动时弹窗报错:无法在DLL库C:\PATH_TO_PROGRAM\stupid_program.exe中找到入口点_ZNKSt10filesystem7_cxx114path5_list13_impl_deletercIEPN"_5_ImpIE
  • 已排除问题:不属于MinGW g++ 8.x版本中<filesystem>无法编译的旧bug,当前程序可正常编译,仅跨设备运行失败

复现代码

#include<fstream>
#include<filesystem>

using namespace std;
int main(int argc, char* argv[])
{
    ofstream OUT("location.txt");
    OUT<<filesystem::current_path()<<endl;
    OUT.close();
    return 0;
}

原编译命令

g++ stupid_program.cpp -o stupid_program.exe -std=c++17 -O2 -Wall -Wextra -Wpedantic
原因说明

你持有的「<filesystem>是C++标准库组成部分、无独立对应dll文件」的认知,在gcc 9.2版本的MinGW环境下不成立:
gcc 9.x版本尚未将<filesystem>的实现完全合并入主libstdc++标准库,相关实现独立存放在libstdc++fs库中,存在对应的动态链接文件。编译机因为本地MinGW的bin目录默认在系统PATH中,运行时可以自动找到对应dll因此运行正常;其他设备没有对应dll文件,就会触发入口点找不到的报错。

可行解决方案

二选一即可:

  • 方案1(推荐,单exe即可分发,无需附带额外dll):编译时增加静态链接参数,显式链接filesystem库,将所有运行时依赖编译进exe
    调整后的编译命令:
    g++ stupid_program.cpp -o stupid_program.exe -std=c++17 -O2 -Wall -Wextra -Wpedantic -static -lstdc++fs
    
    参数说明:
    • -lstdc++fs:显式链接gcc实现filesystem功能的独立库
    • -static:静态链接libgcc、libstdc++、libwinpthread等所有MinGW运行时依赖,生成的exe不依赖任何MinGW相关dll
  • 方案2:不做全静态编译,找到MinGW安装目录下bin文件夹中的libstdc++-6.dll、libgcc_s_dw2-1.dll(32位mingw32对应文件,64位mingw64对应为libgcc_s_seh-1.dll)、libstdc++fs-6.dll、libwinpthread-1.dll,将这4个dll和编译好的exe放在同一目录,一起打包分发给用户即可。注意dll版本必须和编译时使用的MinGW版本完全一致,否则仍可能出现入口点不匹配错误。

补充建议:如果经常需要编译分发使用<filesystem>的程序,建议升级MinGW g到10及以上版本,该版本之后已经将filesystem实现合并入主libstdc库,链接逻辑更稳定,出现依赖缺失问题的概率更低。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 19:48:31