无法在 windows 上的 g++ / msys2 中使用文件系统

can't use filesystem in g++ / msys2 on windows

所以,我正在 windows 10 机器上编写 C++ 代码。我通常使用 cmake (3.17.2) 和 minGW (g++ 9.3.0) 我发现了 "filesystem" 并决定使用它,但一直收到未定义的错误。显然 "filesystem" 直到第 9 版才在 minGW 上实现,当时我使用的是第 8 版。所以,我升级到第 9 版。升级后,由于线程问题,我的程序无法编译能够通过安装 msys2 并使用其包管理器安装完整的工具链来解决。

我目前的问题是,当我查询 msys2 时说它已安装:

$ pacboy -Ss filesystem

msys/filesystem 2020.02-2 (base) [installed]
    Base filesystem

但是当我尝试从命令行编译程序时,我得到了这个:

   F:\things\software\Template-CMD>g++ main.cpp 
main.cpp: In function 'int main(int, char**)': main.cpp:5:10: error: 'std::filesystem' has not been declared
        5 |     std::filesystem::current_path();
          |          ^~~~~~~~~~

这是编译以下由一个文件组成的小测试程序的输出,"main.cpp":

#include <iostream>
#include <filesystem>

int main(int, char**) {
    std::filesystem::current_path();
    std::cout << "Hello, world!\n";
}

我可以使用 windows 文件搜索来确认名为 "filesystem" 的文件确实存在于:

C:\msys64\mingw64\include\c++.3.0\filesystem

所以我试图将它复制到 include 文件夹中:

C:\msys64\mingw64\include\filesystem

但这也没有用。我的 PATH 中只有一个 g++ 编译器:

C:\msys64\mingw64\bin

要显示 g++ 是版本 9:

F:\things\software\Template-CMD>g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.3.0/lto-wrapper.exe
Target: x86_64-w64-mingw32
Configured with: ../gcc-9.3.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='Rev2, Built by MSYS2 project' --with-bugurl=https://sourceforge.net/projects/msys2 --with-gnu-as --with-gnu-ld
Thread model: posix
gcc version 9.3.0 (Rev2, Built by MSYS2 project)

File system 是计算中的通用术语,在不同的上下文中可能有不同的含义。

您找到的名为 filesystem 的 MSYS2 包只是 MSYS2 的基本包,它在 MSYS2 中安装了一堆文件和文件夹。与任何其他 MSYS2 软件包一样,您可以调查 filesystem 以准确查看它通过 运行 pacman -Ql filesystem 安装的内容。但是这个包与手头的问题无关。

通过在 C++ 程序中编写 #include <filesystem> 加载的库是 C++ 标准库的一部分,它可以帮助您访问计算机的文件系统。这部分标准库是在 C++17 中添加的,但是当您没有指定要使用的版本时,GCC 9.3.0 默认使用一些旧版本的 C++。要使用 filesystem,您应该使用如下命令编译您的程序,该命令指定您要使用 C++17:

g++ -std=gnu++17 main.cpp