【问题标题】:Apple Clang; using C++11 with libstdc++苹果铿锵;将 C++11 与 libstdc++ 一起使用
【发布时间】:2016-06-06 13:34:33
【问题描述】:

当同时使用-stdlib=libstdc++-std=c++11 时,我在使用带有initializer_list 参数的空函数编译简单的Hello 文件时遇到问题

如果我只使用-std=c++11(这意味着用libc++编译)

然后文件编译并打印 Hello!

如果我评论 function_test 并且我同时使用 -std=c++11-stdlib=libstdc++

然后文件编译并打印 Hello!

如果我保留函数function_test 并同时使用-std=c++11-stdlib=libstdc++

然后我收到以下错误:

$ g++ -stdlib=libstdc++  -std=c++11   -o test test.cpp
test.cpp:1:10: fatal error: 'initializer_list' file not found
#include <initializer_list>
          ^
1 error generated.

这是我的文件

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

void function_test(initializer_list<int> something){}

int main(int argc, char * argv[])
{
   cout << "Hello!" << endl;
   function_test({0});
   return 0;
}

这是我的苹果clang版本

Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr
--with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 7.0.2 (clang-700.1.81)
Target: x86_64-apple-darwin15.3.0
Thread model: posix

【问题讨论】:

  • 包含目录中的 intializer_list 是否可用?
  • 一个简单的g++ --std=c++11 -o test test.cpp 就可以了。
  • @Jean-BaptisteYunès 是的,正如我在问题中所说,这很好用。但是我需要使用另一个用 libstdc++ 编译的库,所以我需要用 libstdc++ 编译我的文件,而不是使用 libC++ 的 clang 标准库
  • @Pooya 这就是您对标准库头文件的期望,对吧?
  • 当然在切换标准库实现的时候会用到不同的头文件。几乎所有的 C++ 标准库都是只有头文件的。

标签: c++ c++11 clang llvm libstdc++


【解决方案1】:
--with-gxx-include-dir=/usr/include/c++/4.2.1
                                       ^^^^^^^

注意“4.2”。对于 C++11,您的 libstdc++ 方式 太旧了。将其升级到某个 5.x 版本以获得完整的 C++11 支持。

【讨论】:

  • 奇怪的是这台电脑是新的mac。它有不到1年的时间。 llvm 版本似乎是最新版本之一。那个clang安装的libstdc++怎么会这么老?
  • libstdc++ 仍然存在以实现向后兼容性。适用于使用旧 Xcode 版本编译的应用程序。 C++11 功能被添加到“新”libc++ 库中,意在替代旧库。
  • Apple 不执行 GPL-3。 4.2 是 GPL-2 下的最后一个 gcc。
  • @HowardHinnant 不是 Apple 用户,但我相信可以在 Apple 下安装现代 gcc(“Homebrew”或类似的东西),一旦完成,可能会告诉 clang 使用现代 libstdc++。
【解决方案2】:

我发现使用 apple-llvm(clang) 无法升级到新版本的 libstdc++。因此,无法将 C++11 的某些功能与 libstdc++ 一起使用。原因是这个:

主线 libstdc++ 已切换到 GPL3,该许可证由 libc++的开发者不能使用。 libstdc++ 4.2(最后一个 GPL2 版本) 可以独立扩展以支持 C++11,但这将是一个 代码库的分支(对于一个项目来说,这通常被认为比 开始一个新的独立的)。 libstdc++ 的另一个问题是 它与 G++ 开发紧密集成,趋于捆绑 与 G++ 的匹配版本相当接近。

来源: http://libcxx.llvm.org/docs/

感谢所有帮助我找到答案的答案/cmets。

【讨论】:

  • 你需要 libstdc++ 吗?如果你这样做了,你总是可以从 macports 或 homebrew 安装 GCC。
  • @kometen 是的,因为我正在使用一个用它编译的库,我没有它的源代码来重新编译它。
  • 好的,我会删除不正确的答案。
  • 实际上,我相信您可以在 mac 上安装一个完整的现代 gcc,包括 libstdc++。然后,您可以使用 gcc + libstdc++ 进行编译,或者(可能)告诉 clang 在哪里可以找到新的 libstdc++。
  • libc++ 和 libstdc++ 在二进制文件中愉快地共存。只要您不将 STL 传递到使用 libstdc++ 构建的遗留组件的接口中,这很好
猜你喜欢
  • 2013-12-01
  • 1970-01-01
  • 2012-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-26
  • 2012-02-25
相关资源
最近更新 更多