Clang拒绝编译libstdc ++的<filesystem>标头

时间:2019-09-16 19:43:46

标签: c++ clang libstdc++ std-filesystem

考虑以下最小示例:

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 ++。

1 个答案:

答案 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_errorbits/fs_path.h中多次使用,除有问题的第636行外,每次使用均低于定义。

该行包含在#ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS中,所以我猜Clang开发人员不会在Windows上运行libstdc ++兼容性测试。


UPD :此问题在GCC 9.3中已解决。