【问题标题】:macOS Clang C++17 filesystem header not found未找到 macOS Clang C++17 文件系统标头
【发布时间】:2017-07-26 18:52:21
【问题描述】:

我需要使用(实验性)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.

当我使用 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

感谢您提供任何有用的意见,因为到目前为止我找不到任何可以解决我的问题的东西(尽管我可能一直在寻找错误的术语)。

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

【问题讨论】:

  • 如果作业有这个要求,也许老师应该告诉你如何实际实现这个(编译器和编译器标志)?
  • 好吧,他只使用 Linux,所以他不知道如何在 mac 上操作...
  • @DeiDei Libc++ (Clang) 不会在 4.0 中发布 &lt;filesystem&gt;
  • 如果你真的必须用 C++17 来做这件事,那么要么在你的 Mac 上安装一个 Linux VM,要么看看像homebrew 这样的东西是否支持 C++17 + 文件系统。
  • 对于gcc案例this may help

标签: c++ macos gcc clang c++17


【解决方案1】:

Libc++ 是 OS X 上的 C++ 标准库,由于规范不稳定,尚未将 &lt;experimental/filesystem&gt; 移动到 &lt;filesystem&gt;

希望&lt;filesystem&gt; 将成为 Clang 6.0 版本的一部分。 (我们错过了 5.0)

【讨论】:

  • 我明白了,谢谢 :) 但它不应该能够包含 吗?
  • Apple 发布上游 libc++ 更改的速度不取决于我。 Libc++ 在 3.9 中首次发布 &lt;experimental/filesystem&gt;,但 Apple 尚未将其作为 XCode 的一部分发布。如果您想从主干构建自己的 libc++ 版本,它将具有 &lt;experimental/filesystem&gt;
  • 包含&lt;experimental/filesystem&gt; 可以获得声明,但要获得定义,您还必须链接-lstdc++fs(对于libstdc++)或I don't know(对于libc++)。如果有人知道,也许他们可以更新这个答案?
  • 很遗憾文件系统仍然无法使用,因为 Xcode 缺少它并且 boost 也缺少规范中的一些功能(例如 charset u8string 转换)。我们能做的就是等待 xcode 9.1 或更高版本
  • 刚安装了 Xcode 9.2 还是没有&lt;experimental/filesystem&gt; :(
【解决方案2】:

Xcode 11 Beta 现在包含&lt;filesystem&gt;。与其他表明 Xcode 10 中支持 beta 的答案不同,Apple 在 release notes 中提到了这一点。

发行说明中还提到,这是否仅受 iOS 13、macOS 10.15、watchOS 6 和 tvOS 13 支持。您将只能将std::filesystem 用于针对这些版本或更高版本的项目。

【讨论】:

  • 是否有可能 仅在最新的操作系统版本上被支持与 Xcode 11 处于测试阶段有关?如果您打算支持 MacOS 10.12 到 10.14,这似乎是行不通的。早期版本的 MacOS 中不是也内置了 Boost 支持吗?也许想法是我们在 10.15 之前调用所有的只是使用 Boost.Filesystem?
  • @SMGreenfield 我怀疑 10.15 之前的 macOS 版本上的 libc++ 完全缺乏文件系统实现。如果您要静态链接libc++ 它的可能,您可以在较旧的系统上运行您的应用程序(但根据实现可能会有其他问题)。 AFIK boost 不随 macOS 一起提供,但没有什么能阻止您构建/提供它。
  • 我使用的是 Xcode 版本 11.2.1 (11B500) 并且没有 filesystem
  • @I.Antonov 我向你保证它存在;我一直在使用它。请务必在您的项目中启用 c++17 模式。您可能还需要将您的 SDK 更改为我的答案中列出的版本之一。
  • @BradAllred 嗨,我去了构建设置,然后从C++ Language Dialect 中选择了C++17[-std=c++17],仍然一样。
【解决方案3】:

回复 Max Raskin:我从 2018 年 7 月 17 日开始安装 Xcode 10 Beta 4,这个版本没有“#include ”或“#include ”。

release notes 也没有提到 libc++17 。发行说明确实提到以下内容在 Xcode 10 中:

示例包含文件位置:

/Applications/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/experimental

【讨论】:

    【解决方案4】:

    编辑

    正如另一个答案中提到的,&lt;filesystem&gt; 根据release notes 在 Xcode 11 Beta 中可用:

    Clang 现在支持适用于 iOS 13、macOS 的 C++17 &lt;filesystem&gt; 库 10.15、watchOS 6 和 tvOS 13。(50988273)

    希望这次能留下来!

    老答案

    刚刚检查了 Xcode 10.2 Beta 4,它有常规的&lt;filesystem&gt;!对于好奇的人,它位于/Applications/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/

    编辑:

    已下载的 Xcode 10.2 (10E125) aaaaand ...&lt;filesystem&gt; 又消失了。 release notes 中没有提及任何内容。如果你碰巧有一个包含 &lt;filesystem&gt; 的 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 更新很可能会破坏此解决方法并需要另一个副本。此外,可能有充分的理由说明测试版实现没有进入发布版。谨慎行事...

    【讨论】:

      【解决方案5】:

      Including 为您提供声明,但 获取您还必须与 -lstdc++fs 链接的定义(对于 libstdc++)或者我不知道(对于 libc++)。如果有人知道,也许他们 可以更新这个答案吗?

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

      【讨论】:

        【解决方案6】:

        如果有人仍然感兴趣,Xcode 10 Beta 附带具有实验/文件系统的 libc++

        更新 Xcode 10 betas 之一,可能是偶然的,不幸的是,Xcode 10.1 没有它:(

        【讨论】:

        • 刚刚安装了 Beta 6,没有任何乐趣
        • 10.1 仍然没有动作。
        • 10.2b3 有 ,但需要链接库。我不确定它是否包含所需的库。
        • @Max Raskin -- 10.2.1 也没有爱?我想知道我们是否可以通过 WWDC 获得带有 std::filesystem 的可行测试版?
        【解决方案7】:

        我安装了 XCode 9.4 - 没有 &lt;filesystem&gt;

        但是 Homebrew 用 LLVM 6 来拯救

        brew update
        brew install llvm
        

        随着PATH 的变化,我离开了。

        【讨论】:

        • PATH 的变化是什么?
        【解决方案8】:

        在c中使用ftw进行递归目录遍历,更多细节here

        打开,-std=c++17 用于 macOS 版本 10.xx,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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-04-29
          • 1970-01-01
          • 2022-07-12
          • 1970-01-01
          • 2021-09-18
          • 1970-01-01
          • 2021-06-29
          • 1970-01-01
          相关资源
          最近更新 更多