【问题标题】:How to compile #include <experimental/any> for clang on OSX如何在 OSX 上为 clang 编译 #include <experimental/any>
【发布时间】:2017-10-22 12:01:14
【问题描述】:

我正在尝试让#include &lt;experimental/any&gt; 在clang OSX 上的C++ 程序中编译

// test.cpp
#include <experimental/any>

int main() {
  return 0;
}

尝试了从here 学到的命令/选项

clang++ -std=c++14 test.cpp -o test -std=c++1z -stdlib=libc++
clang++ -std=c++1x test.cpp -o test -std=c++1z -stdlib=libc++
clang++ -std=c++1y test.cpp -o test -std=c++1z -stdlib=libc++
clang++ -std=c++1z test.cpp -o test -std=c++1z -stdlib=libc++

但它没有编译并抱怨以下错误:

fatal error: 'experimental/any' file not found

clang++ --version 产生以下结果:

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

如何让#include &lt;experimental/any&gt;编译?

我应该在我的机器上升级 clang 吗?

截至今天,clang 是否支持 C++17?如果是,如何获得支持?

【问题讨论】:

  • 截至今日,clang 是否支持 C++17? 该标头不是 C++17 的一部分,您说“截至今日”,但我们不知道您的 Clang 有多旧(因为 Apple 给它一个愚蠢的版本号,与 LLVM 版本号无关)。
  • 截至今天,clang 是否支持 C++17? 如果我可以将我的clang升级到C++ 17并直接使用std::any是一个问题。我想答案是否定的。那么如何让#include &lt;experimental/any&gt; 编译是我寻求答案的主要问题。我已将我的 Xcode 更新为在最新 Sierra 版本上运行的最新版本。我不确定是否有任何方法可以显式升级clang++ 但我拥有的应该是最新的。对吧?
  • 您可以在clang.llvm.org/cxx_status.htmllibcxx.llvm.org/cxx1z_status.html 自己回答这个问题,但这是针对上游 Clang 的,而不是 Xcode 包含的任何内容。 Xcode 不太可能包含最新的,但它们奇怪的版本编号让人很难知道。请参阅沃尔特的回答。

标签: c++ c++11 clang++ c++17 llvm-clang


【解决方案1】:

对于 OSX 10.12.5(使用 Xcode 开发者工具),我们得到

> clang++ -v
Apple LLVM version 8.1.0 (clang-802.0.42)
Target: x86_64-apple-darwin16.6.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

并且/Library/Developer/CommandLineTools/usr/include/c++/v1/experimental 中没有any,而只有

chrono
optional    
string_view 
tuple
utility
algorithm
dynarray    
ratio   
system_error    
type_traits

因此,Apple 的 libc++ 似乎没有提供any/Library/Developer/CommandLineTools/usr/include/c++/v1/ 中也没有any)。您必须使用 GCC 或您自己的 clang 或 boost/any.hpp,所有这些都可以通过 homebrew 安装。

【讨论】:

    【解决方案2】:

    你拼错了。它是“实验性的”,而不是“实验性的”。

    但是,从 Clang 4.0 开始,您应该只使用 &lt;any&gt;

    【讨论】:

    • 我真的很抱歉拼写错误。我现在更正了:)
    • 你的意思是#include &lt;any&gt;。没有。它不起作用
    • clang++ --version 不知道它是否是“clang 4.0”。如何获得 clang 4.0 ?
    猜你喜欢
    • 1970-01-01
    • 2012-12-16
    • 2012-03-14
    • 2020-07-06
    • 1970-01-01
    • 2016-02-04
    • 2017-08-19
    • 2016-09-20
    • 1970-01-01
    相关资源
    最近更新 更多