我正在尝试使用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只会执行任何操作。没有输出,也没有错误。 $?(据说包含程序的返回码)是运行程序后的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调用注释掉了这一行,则会得到$?输出,并且0std::filesystem::current_path(),因此编译器可以正常工作。)

最佳答案

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

TL; DR

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

关于一百万个MinGW的故事

问题是由于我的本地设置很奇怪。随着时间的流逝,我累积了各种版本的MinGW遍布我的计算机。如果我需要一个实用程序,例如diff,我会用谷歌搜索并从某个地方(通常是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 Bash的MinGW副本中的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 程序,该 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

    07-24 09:45
    查看更多