考虑以下最小示例:
md-location
它可以在GCC 9.2中正常工作,但是Clang 8.0.1拒绝编译#include <filesystem>
#include <iostream>
int main()
{
std::cout << std::filesystem::current_path() << '\n';
}
头文件(来自GCC 9.2的libstdc ++):
<filesystem>
是Clang错误还是libstdc ++错误?
我在MSYS2错误跟踪器上发现了this bug report,但是那里没有有用的信息。
在我们等待正式修复时,是否有办法修补# clang++ 1.cpp -std=c++17
In file included from 1.cpp:1:
In file included from Z:\Lander\msys2\mingw64\include\c++\9.2.0\filesystem:37:
Z:\Lander\msys2\mingw64\include\c++\9.2.0\bits/fs_path.h:636:31: error: invalid use of incomplete
type 'std::filesystem::__cxx11::filesystem_error'
_GLIBCXX_THROW_OR_ABORT(filesystem_error(
^~~~~~~~~~~~~~~~~
Z:\Lander\msys2\mingw64\include\c++\9.2.0\x86_64-w64-mingw32\bits/c++config.h:177:49: note: expanded
from macro '_GLIBCXX_THROW_OR_ABORT'
# define _GLIBCXX_THROW_OR_ABORT(_EXC) (throw (_EXC))
^~~~
Z:\Lander\msys2\mingw64\include\c++\9.2.0\bits/fs_fwd.h:61:9: note: forward declaration of
'std::filesystem::__cxx11::filesystem_error'
class filesystem_error;
^
1 error generated.
标头以消除此错误?
我在Windows上。我正在使用MSYS2软件包中提供的最新GCC和Clang。
GCC标识为:
<filesystem>
C语为:
# g++ --version
g++.exe (Rev2, Built by MSYS2 project) 9.2.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Clang使用此GCC随附的libstdc ++。
答案 0 :(得分:3)
可以通过修补<msys2_path>/mingw64/include/c++/9.2.0/bits/fs_path.h
来解决此问题。
在666-692行,有一个class filesystem_error
的定义。它必须向上移动到第614行,位于u8path()
的定义上方。
我认为这是一个libstdc ++错误。我已经举报了here。
class filesystem_error
在bits/fs_path.h
中多次使用,除有问题的第636行外,每次使用均低于定义。
该行包含在#ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS
中,所以我猜Clang开发人员不会在Windows上运行libstdc ++兼容性测试。
UPD :此问题在GCC 9.3中已解决。