C++17 filesystem using nuwen MinGW on Windows 10
Asked Answered
L

1

9

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.

Here is the code that I am trying to compile:

#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>

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

Edit: 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

Landre answered 15/9, 2018 at 7:14 Comment(7)
@Galik, as you thought, this did not change the error I was getting, but thanks for pointing that out, I am assuming that would have been the next stumbling block after this one!Landre
Does the filesystem TS work? If you change to #include <experimental/filesystem> and namespace fs = std::experimental::filesystem;?Geaghan
@Galik, I get a no such file or directory error when trying to #include <experimental/filesystem>Landre
Does anything else work? Have you tried compiling something without filesystem?Geaghan
A standard Hello World test compiles properlyLandre
Seems to be a bug.Subsist
Just fired up an arch linux vagrant box and the same code compiled just fine on there, definitely seems to be related to the bug that @Subsist linked toLandre
S
4

try latest msys2 instead of nuwen distro:

  1. pacman -Syu

  2. pacman -S mingw-w64-x86_64-gcc

  3. gcc -v

    $ 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)

Sardonyx answered 17/9, 2018 at 23:27 Comment(1)
Current g++ version distributed with msys2 is 9.1.0. That is just great.Twinkle

© 2022 - 2024 — McMap. All rights reserved.