在Windows 10上使用nuwen MinGW的C ++ 17文件系统

问题描述:

我想试用C ++ 17中的新文件系统库,因此尝试复制 cppreference.com 中的> std :: filesystem :: current_path示例,并使用在Windows 10 x64计算机上从nuwen.net 发行的MinGW。其中包括gcc v8.1,该版本应根据 cppreference.com编译器支持页面支持文件系统库。

I wanted to try out the new filesystem library in C++17, so tried copying the std::filesystem::current_path example from cppreference.com and compiling it using the latest version (16.0) of the MinGW distribution from nuwen.net on my Windows 10 x64 machine. This includes gcc v8.1 which should support the filesystem library according to cppreference.com compiler support page.

这是我要编译的代码:

#include <iostream>
#include <filesystem>
namespace fs = std::filesystem;
int main()
{
    std::cout << "Current path is " << fs::current_path() << '\n';
}

我正在使用的编译器命令:

And the compiler command I am using:

g++ -std=c++17 filesystem_test.cpp

这是我尝试编译时遇到的错误:

Here is the error I am getting when trying to compile:

In file included from c:\mingw\include\c++\8.1.0\filesystem:37,
                 from filesystem_test.cpp:2:
c:\mingw\include\c++\8.1.0\bits\fs_path.h: In member function 'std::filesystem::__cxx11::path& std::filesystem::__cxx11::path::operator/=(const std::filesystem::__cxx11::path&)':
c:\mingw\include\c++\8.1.0\bits\fs_path.h:237:47: error: no match for 'operator!=' (operand types are 'std::filesystem::__cxx11::path' and 'std::filesystem::__cxx11::path')
    || (__p.has_root_name() && __p.root_name() != root_name()))
                               ~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~
In file included from c:\mingw\include\c++\8.1.0\iosfwd:40,
                 from c:\mingw\include\c++\8.1.0\ios:38,
                 from c:\mingw\include\c++\8.1.0\ostream:38,
                 from c:\mingw\include\c++\8.1.0\iostream:39,
                 from filesystem_test.cpp:1:
c:\mingw\include\c++\8.1.0\bits\postypes.h:221:5: note: candidate: 'template<class _StateT> bool std::operator!=(const std::fpos<_StateT>&, const std::fpos<_StateT>&)'
     operator!=(const fpos<_StateT>& __lhs, const fpos<_StateT>& __rhs)
     ^~~~~~~~
c:\mingw\include\c++\8.1.0\bits\postypes.h:221:5: note:   template argument deduction/substitution failed:
In file included from c:\mingw\include\c++\8.1.0\filesystem:37,
                 from filesystem_test.cpp:2:
c:\mingw\include\c++\8.1.0\bits\fs_path.h:237:60: note:   'std::filesystem::__cxx11::path' is not derived from 'const std::fpos<_StateT>'
    || (__p.has_root_name() && __p.root_name() != root_name()))
                                                            ^
In file included from c:\mingw\include\c++\8.1.0\bits\stl_algobase.h:64,
                 from c:\mingw\include\c++\8.1.0\bits\char_traits.h:39,
                 from c:\mingw\include\c++\8.1.0\ios:40,
                 from c:\mingw\include\c++\8.1.0\ostream:38,
                 from c:\mingw\include\c++\8.1.0\iostream:39,
                 from filesystem_test.cpp:1:
c:\mingw\include\c++\8.1.0\bits\stl_pair.h:456:5: note: candidate: 'template<class _T1, class _T2> constexpr bool std::operator!=(const std::pair<_T1, _T2>&, const std::pair<_T1, _T2>&)'
     operator!=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
     ^~~~~~~~
c:\mingw\include\c++\8.1.0\bits\stl_pair.h:456:5: note:   template argument deduction/substitution failed:
In file included from c:\mingw\include\c++\8.1.0\filesystem:37,
                 from filesystem_test.cpp:2:
c:\mingw\include\c++\8.1.0\bits\fs_path.h:237:60: note:   'std::filesystem::__cxx11::path' is not derived from 'const std::pair<_T1, _T2>'
    || (__p.has_root_name() && __p.root_name() != root_name()))
                                                            ^
In file included from c:\mingw\include\c++\8.1.0\bits\stl_algobase.h:67,
                 from c:\mingw\include\c++\8.1.0\bits\char_traits.h:39,
                 from c:\mingw\include\c++\8.1.0\ios:40,
                 from c:\mingw\include\c++\8.1.0\ostream:38,
                 from c:\mingw\include\c++\8.1.0\iostream:39,
                 from filesystem_test.cpp:1:
c:\mingw\include\c++\8.1.0\bits\stl_iterator.h:311:5: note: candidate: 'template<class _Iterator> constexpr bool std::operator!=(const std::reverse_iterator<_Iterator>&, const std::reverse_iterator<_Iterator>&)'
     operator!=(const reverse_iterator<_Iterator>& __x,
     ^~~~~~~~
c:\mingw\include\c++\8.1.0\bits\stl_iterator.h:311:5: note:   template argument deduction/substitution failed:
In file included from c:\mingw\include\c++\8.1.0\filesystem:37,
                 from filesystem_test.cpp:2:
c:\mingw\include\c++\8.1.0\bits\fs_path.h:237:60: note:   'std::filesystem::__cxx11::path' is not derived from 'const std::reverse_iterator<_Iterator>'
    || (__p.has_root_name() && __p.root_name() != root_name()))
                                                            ^
In file included from c:\mingw\include\c++\8.1.0\bits\stl_algobase.h:67,
                 from c:\mingw\include\c++\8.1.0\bits\char_traits.h:39,
                 from c:\mingw\include\c++\8.1.0\ios:40,
                 from c:\mingw\include\c++\8.1.0\ostream:38,
                 from c:\mingw\include\c++\8.1.0\iostream:39,
                 from filesystem_test.cpp:1:
c:\mingw\include\c++\8.1.0\bits\stl_iterator.h:349:5: note: candidate: 'template<class _IteratorL, class _IteratorR> constexpr bool std::operator!=(const std::reverse_iterator<_Iterator>&, const std::reverse_iterator<_IteratorR>&)'
     operator!=(const reverse_iterator<_IteratorL>& __x,
     ^~~~~~~~
c:\mingw\include\c++\8.1.0\bits\stl_iterator.h:349:5: note:   template argument deduction/substitution failed:
In file included from c:\mingw\include\c++\8.1.0\filesystem:37,
                 from filesystem_test.cpp:2:
c:\mingw\include\c++\8.1.0\bits\fs_path.h:237:60: note:   'std::filesystem::__cxx11::path' is not derived from 'const std::reverse_iterator<_Iterator>'
    || (__p.has_root_name() && __p.root_name() != root_name()))
                                                            ^
In file included from c:\mingw\include\c++\8.1.0\bits\stl_algobase.h:67,
                 from c:\mingw\include\c++\8.1.0\bits\char_traits.h:39,
                 from c:\mingw\include\c++\8.1.0\ios:40,
                 from c:\mingw\include\c++\8.1.0\ostream:38,
                 from c:\mingw\include\c++\8.1.0\iostream:39,
                 from filesystem_test.cpp:1:
c:\mingw\include\c++\8.1.0\bits\stl_iterator.h:1124:5: note: candidate: 'template<class _IteratorL, class _IteratorR> constexpr bool std::operator!=(const std::move_iterator<_IteratorL>&, const std::move_iterator<_IteratorR>&)'
     operator!=(const move_iterator<_IteratorL>& __x,
     ^~~~~~~~
c:\mingw\include\c++\8.1.0\bits\stl_iterator.h:1124:5: note:   template argument deduction/substitution failed:
In file included from c:\mingw\include\c++\8.1.0\filesystem:37,
                 from filesystem_test.cpp:2:
c:\mingw\include\c++\8.1.0\bits\fs_path.h:237:60: note:   'std::filesystem::__cxx11::path' is not derived from 'const std::move_iterator<_IteratorL>'
    || (__p.has_root_name() && __p.root_name() != root_name()))
                                                            ^
In file included from c:\mingw\include\c++\8.1.0\bits\stl_algobase.h:67,
                 from c:\mingw\include\c++\8.1.0\bits\char_traits.h:39,
                 from c:\mingw\include\c++\8.1.0\ios:40,
                 from c:\mingw\include\c++\8.1.0\ostream:38,
                 from c:\mingw\include\c++\8.1.0\iostream:39,
                 from filesystem_test.cpp:1:
c:\mingw\include\c++\8.1.0\bits\stl_iterator.h:1130:5: note: candidate: 'template<class _Iterator> constexpr bool std::operator!=(const std::move_iterator<_IteratorL>&, const std::move_iterator<_IteratorL>&)'
     operator!=(const move_iterator<_Iterator>& __x,
     ^~~~~~~~
c:\mingw\include\c++\8.1.0\bits\stl_iterator.h:1130:5: note:   template argument deduction/substitution failed:
In file included from c:\mingw\include\c++\8.1.0\filesystem:37,
                 from filesystem_test.cpp:2:
c:\mingw\include\c++\8.1.0\bits\fs_path.h:237:60: note:   'std::filesystem::__cxx11::path' is not derived from 'const std::move_iterator<_IteratorL>'
    || (__p.has_root_name() && __p.root_name() != root_name()))
                                                            ^
In file included from c:\mingw\include\c++\8.1.0\string:41,
                 from c:\mingw\include\c++\8.1.0\bits\locale_classes.h:40,
                 from c:\mingw\include\c++\8.1.0\bits\ios_base.h:41,
                 from c:\mingw\include\c++\8.1.0\ios:42,
                 from c:\mingw\include\c++\8.1.0\ostream:38,
                 from c:\mingw\include\c++\8.1.0\iostream:39,
                 from filesystem_test.cpp:1:
c:\mingw\include\c++\8.1.0\bits\allocator.h:158:5: note: candidate: 'template<class _T1, class _T2> bool std::operator!=(const std::allocator<_CharT>&, const std::allocator<_T2>&)'
     operator!=(const allocator<_T1>&, const allocator<_T2>&)
     ^~~~~~~~
c:\mingw\include\c++\8.1.0\bits\allocator.h:158:5: note:   template argument deduction/substitution failed:
In file included from c:\mingw\include\c++\8.1.0\filesystem:37,
                 from filesystem_test.cpp:2:
c:\mingw\include\c++\8.1.0\bits\fs_path.h:237:60: note:   'std::filesystem::__cxx11::path' is not derived from 'const std::allocator<_CharT>'
    || (__p.has_root_name() && __p.root_name() != root_name()))
                                                            ^
In file included from c:\mingw\include\c++\8.1.0\string:41,
                 from c:\mingw\include\c++\8.1.0\bits\locale_classes.h:40,
                 from c:\mingw\include\c++\8.1.0\bits\ios_base.h:41,
                 from c:\mingw\include\c++\8.1.0\ios:42,
                 from c:\mingw\include\c++\8.1.0\ostream:38,
                 from c:\mingw\include\c++\8.1.0\iostream:39,
                 from filesystem_test.cpp:1:
c:\mingw\include\c++\8.1.0\bits\allocator.h:164:5: note: candidate: 'template<class _Tp> bool std::operator!=(const std::allocator<_CharT>&, const std::allocator<_CharT>&)'
     operator!=(const allocator<_Tp>&, const allocator<_Tp>&)
     ^~~~~~~~
c:\mingw\include\c++\8.1.0\bits\allocator.h:164:5: note:   template argument deduction/substitution failed:
In file included from c:\mingw\include\c++\8.1.0\filesystem:37,
                 from filesystem_test.cpp:2:
c:\mingw\include\c++\8.1.0\bits\fs_path.h:237:60: note:   'std::filesystem::__cxx11::path' is not derived from 'const std::allocator<_CharT>'
    || (__p.has_root_name() && __p.root_name() != root_name()))
                                                            ^
In file included from c:\mingw\include\c++\8.1.0\bits\basic_string.h:48,
                 from c:\mingw\include\c++\8.1.0\string:52,
                 from c:\mingw\include\c++\8.1.0\bits\locale_classes.h:40,
                 from c:\mingw\include\c++\8.1.0\bits\ios_base.h:41,
                 from c:\mingw\include\c++\8.1.0\ios:42,
                 from c:\mingw\include\c++\8.1.0\ostream:38,
                 from c:\mingw\include\c++\8.1.0\iostream:39,
                 from filesystem_test.cpp:1:
c:\mingw\include\c++\8.1.0\string_view:454:5: note: candidate: 'template<class _CharT, class _Traits> constexpr bool std::operator!=(std::basic_string_view<_CharT, _Traits>, std::basic_string_view<_CharT, _Traits>)'
     operator!=(basic_string_view<_CharT, _Traits> __x,
     ^~~~~~~~
c:\mingw\include\c++\8.1.0\string_view:454:5: note:   template argument deduction/substitution failed:
In file included from c:\mingw\include\c++\8.1.0\filesystem:37,
                 from filesystem_test.cpp:2:
c:\mingw\include\c++\8.1.0\bits\fs_path.h:237:60: note:   'std::filesystem::__cxx11::path' is not derived from 'std::basic_string_view<_CharT, _Traits>'
    || (__p.has_root_name() && __p.root_name() != root_name()))
                                                            ^
In file included from c:\mingw\include\c++\8.1.0\bits\basic_string.h:48,
                 from c:\mingw\include\c++\8.1.0\string:52,
                 from c:\mingw\include\c++\8.1.0\bits\locale_classes.h:40,
                 from c:\mingw\include\c++\8.1.0\bits\ios_base.h:41,
                 from c:\mingw\include\c++\8.1.0\ios:42,
                 from c:\mingw\include\c++\8.1.0\ostream:38,
                 from c:\mingw\include\c++\8.1.0\iostream:39,
                 from filesystem_test.cpp:1:
c:\mingw\include\c++\8.1.0\string_view:460:5: note: candidate: 'template<class _CharT, class _Traits> constexpr bool std::operator!=(std::basic_string_view<_CharT, _Traits>, std::__detail::__idt<std::basic_string_view<_CharT, _Traits> >)'
     operator!=(basic_string_view<_CharT, _Traits> __x,
     ^~~~~~~~
c:\mingw\include\c++\8.1.0\string_view:460:5: note:   template argument deduction/substitution failed:
In file included from c:\mingw\include\c++\8.1.0\filesystem:37,
                 from filesystem_test.cpp:2:
c:\mingw\include\c++\8.1.0\bits\fs_path.h:237:60: note:   'std::filesystem::__cxx11::path' is not derived from 'std::basic_string_view<_CharT, _Traits>'
    || (__p.has_root_name() && __p.root_name() != root_name()))
                                                            ^
In file included from c:\mingw\include\c++\8.1.0\bits\basic_string.h:48,
                 from c:\mingw\include\c++\8.1.0\string:52,
                 from c:\mingw\include\c++\8.1.0\bits\locale_classes.h:40,
                 from c:\mingw\include\c++\8.1.0\bits\ios_base.h:41,
                 from c:\mingw\include\c++\8.1.0\ios:42,
                 from c:\mingw\include\c++\8.1.0\ostream:38,
                 from c:\mingw\include\c++\8.1.0\iostream:39,
                 from filesystem_test.cpp:1:
c:\mingw\include\c++\8.1.0\string_view:466:5: note: candidate: 'template<class _CharT, class _Traits> constexpr bool std::operator!=(std::__detail::__idt<std::basic_string_view<_CharT, _Traits> >, std::basic_string_view<_CharT, _Traits>)'
     operator!=(__detail::__idt<basic_string_view<_CharT, _Traits>> __x,
     ^~~~~~~~
c:\mingw\include\c++\8.1.0\string_view:466:5: note:   template argument deduction/substitution failed:
In file included from c:\mingw\include\c++\8.1.0\filesystem:37,
                 from filesystem_test.cpp:2:
c:\mingw\include\c++\8.1.0\bits\fs_path.h:237:60: note:   'std::filesystem::__cxx11::path' is not derived from 'std::basic_string_view<_CharT, _Traits>'
    || (__p.has_root_name() && __p.root_name() != root_name()))
                                                            ^
In file included from c:\mingw\include\c++\8.1.0\string:52,
                 from c:\mingw\include\c++\8.1.0\bits\locale_classes.h:40,
                 from c:\mingw\include\c++\8.1.0\bits\ios_base.h:41,
                 from c:\mingw\include\c++\8.1.0\ios:42,
                 from c:\mingw\include\c++\8.1.0\ostream:38,
                 from c:\mingw\include\c++\8.1.0\iostream:39,
                 from filesystem_test.cpp:1:
c:\mingw\include\c++\8.1.0\bits\basic_string.h:6056:5: note: candidate: 'template<class _CharT, class _Traits, class _Alloc> bool std::operator!=(const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&, const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&)'
     operator!=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
     ^~~~~~~~
c:\mingw\include\c++\8.1.0\bits\basic_string.h:6056:5: note:   template argument deduction/substitution failed:
In file included from c:\mingw\include\c++\8.1.0\filesystem:37,
                 from filesystem_test.cpp:2:
c:\mingw\include\c++\8.1.0\bits\fs_path.h:237:60: note:   'std::filesystem::__cxx11::path' is not derived from 'const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>'
    || (__p.has_root_name() && __p.root_name() != root_name()))
                                                            ^
In file included from c:\mingw\include\c++\8.1.0\string:52,
                 from c:\mingw\include\c++\8.1.0\bits\locale_classes.h:40,
                 from c:\mingw\include\c++\8.1.0\bits\ios_base.h:41,
                 from c:\mingw\include\c++\8.1.0\ios:42,
                 from c:\mingw\include\c++\8.1.0\ostream:38,
                 from c:\mingw\include\c++\8.1.0\iostream:39,
                 from filesystem_test.cpp:1:
c:\mingw\include\c++\8.1.0\bits\basic_string.h:6069:5: note: candidate: 'template<class _CharT, class _Traits, class _Alloc> bool std::operator!=(const _CharT*, const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&)'
     operator!=(const _CharT* __lhs,
     ^~~~~~~~
c:\mingw\include\c++\8.1.0\bits\basic_string.h:6069:5: note:   template argument deduction/substitution failed:
In file included from c:\mingw\include\c++\8.1.0\filesystem:37,
                 from filesystem_test.cpp:2:
c:\mingw\include\c++\8.1.0\bits\fs_path.h:237:60: note:   mismatched types 'const _CharT*' and 'std::filesystem::__cxx11::path'
    || (__p.has_root_name() && __p.root_name() != root_name()))
                                                            ^
In file included from c:\mingw\include\c++\8.1.0\string:52,
                 from c:\mingw\include\c++\8.1.0\bits\locale_classes.h:40,
                 from c:\mingw\include\c++\8.1.0\bits\ios_base.h:41,
                 from c:\mingw\include\c++\8.1.0\ios:42,
                 from c:\mingw\include\c++\8.1.0\ostream:38,
                 from c:\mingw\include\c++\8.1.0\iostream:39,
                 from filesystem_test.cpp:1:
c:\mingw\include\c++\8.1.0\bits\basic_string.h:6081:5: note: candidate: 'template<class _CharT, class _Traits, class _Alloc> bool std::operator!=(const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&, const _CharT*)'
     operator!=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
     ^~~~~~~~
<snip>

注意,我必须剪掉错误消息的末尾以减少此问题的字符数。我已将整个错误消息放在此处: https://pastebin.com/pnfMnMs7

Note I had to snip the end of the error message to reduce the character count for this question. I have put the entire error message here: https://pastebin.com/pnfMnMs7

编辑:根据Galik的评论,我尝试将编译器命令更改为

As per Galik's comment, I tried changing my compiler command to

g++ -std=c++17 filesystem_test.cpp -lstdc++fs

但是我似乎遇到了与以前完全相同的错误

However I seem to get exactly the same error as before

尝试最新 msys2 而不是nuwen发行版:

try latest msys2 instead of nuwen distro:


  1. pacman -Syu

  1. pacman -Syu

pacman -S mingw-w64-x86_64-gcc

pacman -S mingw-w64-x86_64-gcc

gcc -v

$ gcc -v
使用内置规范。
COLLECT_GCC = C:\msys64\mingw64\bin\gcc.exe
COLLECT_LTO_WRAPPER = C:/ msys64 / mingw64 / bin /../ lib / gcc / x86_64-w64-mingw32 / 8.2.0 / lto-wrapper.exe
目标:x86_64-w64-mingw32
配置为:../gcc-8.2.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 = ada,c,lto,c ++,objc,obj -c ++,fortran --enable-shared --enable-static --enable-libatomic --enable-threads = posix --enable-graphite --enable-full-dynamic-string --enable-libstdcxx-filesystem-ts =是-启用libstdcxx时间=是-禁用libstdcxx-pch-禁用libstdcxx调试-禁用isl版本检查-启用lto-启用libgomp-禁用多库- enable-checking = release --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --w ith-libiconv --with-system-zlib --with-gmp = / mingw64 --with-mpfr = / mingw64 --with-mpc = / mingw64 --with-isl = / mingw64 --with-pkgversion ='Rev1 ,由MSYS2项目构建 --with-bugurl = https://sourceforge.net/projects/msys2 --with-gnu-as --with-gnu-ld
线程模型:posix
gcc版本8.2.0(Rev1,由MSYS2项目构建)

$ gcc -v Using built-in specs. COLLECT_GCC=C:\msys64\mingw64\bin\gcc.exe COLLECT_LTO_WRAPPER=C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.2.0/lto-wrapper.exe Target: x86_64-w64-mingw32 Configured with: ../gcc-8.2.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=ada,c,lto,c++,objc,obj-c++,fortran --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 --with-libiconv --with-system-zlib --with-gmp=/mingw64 --with-mpfr=/mingw64 --with-mpc=/mingw64 --with-isl=/mingw64 --with-pkgversion='Rev1, Built by MSYS2 project' --with-bugurl=https://sourceforge.net/projects/msys2 --with-gnu-as --with-gnu-ld Thread model: posix gcc version 8.2.0 (Rev1, Built by MSYS2 project)