使用 <filesystem> 库的 C++ 程序在 Windows 上什么都不做

C++ Program using <filesystem> Library just does nothing on Windows

我正在尝试在 Windows 上使用 <filesystem> 库 运行 获取程序。我正在使用 MSYS2(64 位)g++.

#include <iostream>
#include <filesystem>

int main()
{
    std::cout << "Hello World\n";
    std::cout << "Current path is " << std::filesystem::current_path() << '\n';
}

我用

构建它
g++ -std=c++17 -Wall -Werror -Wextra main.cpp -lstdc++fs

我没有从编译器得到控制台输出。它默默地生成一个 a.exe。执行 a.exe 什么都不做。没有输出,也没有错误。 $?(据说包含程序的return代码)在运行程序之后127

g++ -v 打印:

Using built-in specs.
COLLECT_GCC=C:\msys64\mingw64\bin\g++.exe
COLLECT_LTO_WRAPPER=C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.1.0/lto-wrapper.exe
Target: x86_64-w64-mingw32
Configured with: ../gcc-9.1.0/configure --prefix=/mingw64 --with-local-prefix=/mingw64/local --build=x86_64-w64-mingw32 --host=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --with-native-system-header-dir=/mingw64/x86_64-w64-mingw32/include --libexecdir=/mingw64/lib --enable-bootstrap --with-arch=x86-64 --with-tune=generic --enable-languages=c,lto,c++,fortran,ada,objc,obj-c++ --enable-shared --enable-static --enable-libatomic --enable-threads=posix --enable-graphite --enable-fully-dynamic-string --enable-libstdcxx-filesystem-ts=yes --enable-libstdcxx-time=yes --disable-libstdcxx-pch --disable-libstdcxx-debug --disable-isl-version-check --enable-lto --enable-libgomp --disable-multilib --enable-checking=release --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --enable-plugin --with-libiconv --with-system-zlib --with-gmp=/mingw64 --with-mpfr=/mingw64 --with-mpc=/mingw64 --with-isl=/mingw64 --with-pkgversion='Rev3, Built by MSYS2 project' --with-bugurl=https://sourceforge.net/projects/msys2 --with-gnu-as --with-gnu-ld
Thread model: posix
gcc version 9.1.0 (Rev3, Built by MSYS2 project)

有什么问题吗?

(我得到 Hello World 输出并且 $?0,如果我用 std::filesystem::current_path() 调用注释掉该行,那么编译器正在工作。)

感谢评论者放弃了一些最终让我找到解决方案的想法。

TL;DR

如果您安装了各种基于 MinGW 的工具集(例如 CygwinMinGW , MSYS, Git Bash), 使用套装附带的shell。小心地将 mingw*/bin 路径添加到 PATH;而是坚持各自 shell 的默认 PATH 设置。 Click here, if you want to have convenient context menu shortcuts for the MSYS shell.


关于一百万的故事MinGWs

问题是由于我奇怪的本地设置。随着时间的推移,我在我的计算机上积累了各种版本的 MinGW。如果我需要一个实用程序,比如 diff,我会 google 它并从某个地方下载一些东西(通常 sourceforge),将它安装到某个地方并添加 bin 文件夹到我的 PATH。这种策略适用于大多数情况。

我安装的工具集,包括但不限于:

  • MinGW(32 和 64)
  • Cygwin
  • MSYS
  • Git (+ Git Bash)

很长一段时间以来,我大部分时间都在使用 Git Bash。最近我想获得最新的 g++ 编译器和东西,发现 MSYS2 有一个包管理器 (pacman) 和最新的包所以我安装了它.并将其添加到PATH,然后使用Git Bash.

然而,每个工具集都有自己的 shell 有自己的 PATH 魔法,并且有自己的 MinGW 副本。所以我让我的 Git Bash 使用 MSYS2 g++,但是从 Git Bash 仍然使用来自 Git BashMinGW 的 DLL 复制。我不确定,但我认为这很可能就是问题所在。

为了找出答案,我在 Git Bash 中使用了以下内容:

# because of my PATH adjustment, I got the right g++
$ which g++
/c/msys64/mingw64/bin/g++

# my program uses DLLs from /mingw64, though
$ ldd a.exe
        ntdll.dll => /c/Windows/SYSTEM32/ntdll.dll (0x77060000)
        kernel32.dll => /c/Windows/system32/kernel32.dll (0x76e40000)
        KERNELBASE.dll => /c/Windows/system32/KERNELBASE.dll (0x7fefcc00000)
        msvcrt.dll => /c/Windows/system32/msvcrt.dll (0x7fefcf70000)
        libgcc_s_seh-1.dll => /mingw64/bin/libgcc_s_seh-1.dll (0x61440000)
        libwinpthread-1.dll => /mingw64/bin/libwinpthread-1.dll (0x64940000)
        libstdc++-6.dll => /mingw64/bin/libstdc++-6.dll (0x6fc40000)
        USER32.dll => /c/Windows/system32/USER32.dll (0x76f60000)
        GDI32.dll => /c/Windows/system32/GDI32.dll (0x7fefddb0000)
        LPK.dll => /c/Windows/system32/LPK.dll (0x7fefd540000)
        USP10.dll => /c/Windows/system32/USP10.dll (0x7fefdbe0000)

# with cygpath I can find out that this is actually the Git Bash's installation
$ cygpath -w /mingw64
C:\Program Files\Git\mingw64

MSYS2 带有自己的 shell,它正确设置了 PATH,因此应用程序可以正常工作。在 MSYS2 shell:

$ ./a.exe
Hello World
Current path is "E:\temporary\2019_07_25-gpp_filesystem_test"

万一有人遇到了类似的麻烦,并希望在各种文件夹中更轻松地使用 MSYS2 shell,请使用 reg 脚本为 MSYS2 shell 设置方便的上下文菜单快捷方式:https://github.com/njzhangyifei/msys2-mingw-shortcut-menus