macOS Clang C++17文件系统头文件未找到。

52

我需要使用(实验性的)C++17文件系统库编写程序,但我的Mac(macOS 10.12.03)上的clang似乎没有包含文件系统头文件。

由于我需要使用C++17,因此我不能使用Boost库等替代品。

当我尝试编译一个只包括文件系统和iostream的示例程序(并写入cout)时

#include <filesystem>
#include <iostream>
using namespace std;

int main(){
    cout << "test" << endl;
}

我收到了以下错误信息:

>clang test.cpp -std=c++1z

test.cpp:2:10: fatal error: 'filesystem' file not found
#include <filesystem>
         ^
1 error generated.

当我尝试使用通过homebrew安装的GCC 6.3进行相同操作时,我得到:

>gcc-6 test.cpp  -std=c++17 
test.cpp:2:22: fatal error: filesystem: No such file or directory
 #include <filesystem>
                      ^
compilation terminated.

我也尝试使用experimental/filesystem,它可以使用gcc编译,但似乎会尝试为iOS编译,导致另一个与iostream相关的错误。

Undefined symbols for architecture x86_64:
  "std::ios_base::Init::Init()", referenced from:
      __static_initialization_and_destruction_0(int, int) in ccd5QiVt.o
  "std::ios_base::Init::~Init()", referenced from:
      __static_initialization_and_destruction_0(int, int) in ccd5QiVt.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status

我的clang版本是:

>clang --version
Apple LLVM version 8.0.0 (clang-800.0.42.1)
Target: x86_64-apple-darwin16.4.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

我非常感谢任何有帮助的意见,因为到目前为止我还没有找到解决我的问题的任何东西(尽管我可能搜索了错误的术语)。

如果需要更多信息,我很乐意提供,但我希望已经包含了所有必要的内容。


如果任务有这个要求,也许教练应该告诉你如何实现它(编译器和编译器标志)? - crashmstr
1
他只使用Linux,所以不知道如何在Mac上操作... - snoato
@DeiDei Libc++(Clang)在4.0版本中不会发布<filesystem> - EricWF
如果你真的必须使用C++17,那么可以在Mac上安装Linux虚拟机,或者查看类似homebrew是否已经支持C++17和文件系统。 - Paul R
对于gcc的情况,这可能会有所帮助 - Shafik Yaghmour
这个问题是在最近对C++17进行了最后更改之后提出的,但如果它是实验性的(或者std::experimental),那么它就不是C++17文件系统库。 - Davis Herring
8个回答

27

Libc++ 是 OS X 上的 C++ 标准库,因为规范还不稳定,所以尚未将 <experimental/filesystem> 移动到 <filesystem>

希望 <filesystem> 能成为 Clang 6.0 发布的一部分。(我们错过了 5.0)


4
我明白了,谢谢 :)但是它不应该可以包含<experimental/filesystem>吗? - snoato
2
苹果公司发布上游libc++更改的速度不由我决定。Libc++在3.9中首次发布了<experimental/filesystem>,但苹果公司尚未将其作为XCode的一部分发布。如果您想从主干构建自己的libc++版本,它将包含<experimental/filesystem> - EricWF
5
包含 <experimental/filesystem> 可以让您获得声明,但要获取定义,您还需要链接 -lstdc++fs (针对 libstdc++)或 I don't know (针对 libc++)。如果有人知道,请更新此答案。 - Quuxplusone
3
可惜的是,由于Xcode缺少文件系统,并且boost也缺少规范中的一些功能(例如字符集u8string的转换),因此文件系统仍然无法使用。我们所能做的只是等待Xcode 9.1或更高版本。 - Lothar
14
刚安装了Xcode 9.2,但仍然没有 <experimental/filesystem> :( - Rudolfs Bundulis

17

Xcode 11 Beta现在包括<filesystem>。与其他回答中提到的Xcode 10 beta支持不同,苹果在发布说明中提到了这一点。

在发行说明中还提到,这仅受iOS 13、macOS 10.15、watchOS 6和tvOS 13支持。只有针对这些版本或以后版本的项目才能使用std::filesystem


<filesystem> 仅在最新的操作系统版本上受支持,这是否与 Xcode 11 处于 Beta 版本有关?如果您打算支持 MacOS 10.12 到 10.14,那似乎是行不通的。难道早期版本的 MacOS 中也没有 Boost 支持吗?也许我们可以在 10.15 之前都使用 Boost.Filesystem? - SMGreenfield
@SMGreenfield 我的猜测是,在 macOS 10.15 之前的版本中,libc++ 完全缺少文件系统实现。如果你静态链接 libc++可能 你可以在旧系统上运行你的应用程序(但根据实现方式,这样做可能会有其他问题)。据我所知,Boost 不随 macOS 一起提供,但你可以自己构建/提供它。 - Brad Allred
我正在使用Xcode版本11.2.1(11B500),但是没有“文件系统”。 - I. Antonov
1
@I.Antonov 我向您保证它是存在的;我一直在使用它。请确保在您的项目中启用c++17模式。您可能还需要将SDK更改为我回答中列出的版本之一。 - Brad Allred
1
@BradAllred 你好,我进入了“构建设置”,然后从“C++语言方言”中选择了C++17[-std=c++17],但仍然没有改变。 - I. Antonov
显示剩余2条评论

9
作为对Max Raskin的回复:我安装了2018年7月17日发布的Xcode 10 Beta 4版本,但该版本中没有“#include <experimental/filesystem>”或“#include <filesystem>”。
此外,发行说明也没有提到libc++17 <filesystem>。 发布说明确实提到了以下内容在Xcode 10中可以使用:<any>, <optional>和<variant>。
示例包含文件位置: /Applications/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/experimental

5

编辑

正如另一个回答所提到的那样,根据发布说明<filesystem>在Xcode 11 Beta中可用:

Clang现在支持iOS 13、macOS 10.15、watchOS 6和tvOS 13的C++17 <filesystem>库。(50988273)

希望这次是真的留下来了!

旧回答

刚刚检查了Xcode 10.2 Beta 4,它有常规的<filesystem>!如果您好奇,它在/Applications/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c ++ / v1 / 中。

编辑:

下载了Xcode 10.2(10E125),<filesystem>又消失了。在发布说明中没有任何提及。如果您碰巧有包含<filesystem>的Xcode版本(例如我之前提到的Beta 4),复制文件似乎可以正常工作:

$ sudo cp /Applications/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/filesystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/

请注意,每次 Xcode 更新后这种解决方法很可能会失效,需要重新复制。此外,测试版的实现未能进入正式版本,很可能存在着很好的原因。请谨慎操作...


3

包含头文件可以得到声明,但是要获得定义,你还需要链接 -lstdc++fs(对于 libstdc++)或者我不知道(对于 libc++)。如果有人知道,请更新这个回答。

对于 libc++,你需要链接 -lc++experimental


1
如果有人仍然感兴趣,Xcode 10 Beta附带了具有实验性/文件系统的libc ++。
更新:Xcode 10 beta之一曾经附带它,可能是意外,不幸的是,Xcode 10.1没有它 :(

刚安装了 Beta 6,但是没有成功。 - Steve Wagner
6
10.1了,仍然没有行动。 - t0rakka
10.2b3有<filesystem>,但需要链接库。我不确定它是否包含所需的库。 - leecbaker
@Max Raskin -- 10.2.1版本中也没有更新吗?我想知道我们是否能在WWDC发布一个带有std::filesystem的可行beta版? - SMGreenfield

1

我安装了XCode 9.4 - 没有<filesystem>

但是Homebrew通过LLVM 6来解决问题

brew update
brew install llvm

通过更改PATH,我离开了。


1
PATH 发生了什么变化? - Michael B

0

使用C语言中的ftw进行递归目录遍历,更多细节请点击此处

在macOS版本10.xx上,如果使用-std=c++17,则无法使用filesystem头文件。

#include <ftw.h>
#include <stdio.h>
#include <sys/stat.h>
#include <string.h>

 
int list(const char *name, const struct stat *status, int type)
{
     if (type == FTW_NS)
     {
         return 0;
     }

     if (type == FTW_F)
     {
         printf("0%3o\t%s\n", status->st_mode&0777, name);
     }

     if (type == FTW_D && strcmp(".", name) != 0)
     {
         printf("0%3o\t%s/\n", status->st_mode&0777, name);
     }
     return 0;
}

int main(int argc, char *argv[])
{
     if(argc == 1)
     {
         ftw(".", list, 1);
     }
     else
     {
         ftw(argv[1], list, 1);
     }

     return 0;
}

输出结果如下:

0755    ./Shivaji/
0644    ./Shivaji/20200516_204454.png
0644    ./Shivaji/20200527_160408.png
0644    ./Shivaji/20200527_160352.png
0644    ./Shivaji/20200520_174754.png
0644    ./Shivaji/20200520_180103.png
0755    ./Saif/
0644    ./Saif/Snapchat-1751229005.jpg
0644    ./Saif/Snapchat-1356123194.jpg
0644    ./Saif/Snapchat-613911286.jpg
0644    ./Saif/Snapchat-107742096.jpg
0755    ./Milind/
0644    ./Milind/IMG_1828.JPG
0644    ./Milind/IMG_1839.JPG
0644    ./Milind/IMG_1825.JPG
0644    ./Milind/IMG_1831.JPG
0644    ./Milind/IMG_1840.JPG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接