Neo*_*nit 2 c++ windows g++ msys
我正在尝试使用<filesystem>在 Windows 上运行的库获取程序。我正在使用 MSYS2(64 位)g++。
#include <iostream>
#include <filesystem>
int main()
{
std::cout << "Hello World\n";
std::cout << "Current path is " << std::filesystem::current_path() << '\n';
}
Run Code Online (Sandbox Code Playgroud)
我正在构建它
g++ -std=c++17 -Wall -Werror -Wextra main.cpp -lstdc++fs
Run Code Online (Sandbox Code Playgroud)
我没有从编译器得到控制台输出。它默默地生成一个a.exe. 执行a.exejust 什么都不做。没有输出也没有错误。$?(据说包含程序的返回码)是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)
Run Code Online (Sandbox Code Playgroud)
可能有什么问题?
(我得到一个Hello World输出并且$?是0,如果我用std::filesystem::current_path()调用注释掉该行,那么编译器正在工作。)
感谢评论者放弃一些最终让我找到解决方案的想法。
如果您安装了各种基于MinGW的工具集(例如Cygwin、MinGW、MSYS、Git Bash),请使用该套件附带的 shell。只需小心地将mingw*/bin路径添加到PATH; 而是坚持PATH各自 shell的默认设置。如果您想为MSYS shell提供方便的上下文菜单快捷方式,请单击此处。
问题是由于我奇怪的本地设置。随着时间的推移,我积累了遍布我的计算机的各种版本的MinGW。如果我需要一个实用程序,比如说diff,我会用谷歌搜索它并从某个地方下载一些东西(通常是sourceforge),将它安装到某个地方并将bin文件夹添加到我的PATH. 这种策略适用于大多数事情。
我在一段时间内安装的工具集,包括但不限于:
很长一段时间以来,我大部分时间都在使用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
Run Code Online (Sandbox Code Playgroud)
MSYS2带有自己的外壳,它可以PATH正确设置它以便应用程序正常工作。在MSYS2外壳中:
$ ./a.exe
Hello World
Current path is "E:\\temporary\\2019_07_25-gpp_filesystem_test"
Run Code Online (Sandbox Code Playgroud)
对于不太可能发生的事件,有人遇到类似的问题并希望在各种文件夹中更轻松地使用MSYS2 shell,请查看此 repo,其中包含reg为MSYS2 shell设置方便的上下文菜单快捷方式的脚本:https : //github.com/ njzhangyifei/msys2-mingw-shortcut-menus