【问题标题】:How to check if libc++ is installed?如何检查是否安装了 libc++?
【发布时间】:2016-07-18 16:12:50
【问题描述】:

我正在从源代码构建一些东西。我系统的 gcc 和 stdlibc++ 太旧了,但是我可以使用一个 clang 构建。默认情况下,clang 使用 stdlibc++,但可以选择安装 libc++ 以供 clang 使用。

检查 libc++ 是否使用 clang 安装的最佳方法是什么?

【问题讨论】:

  • 你遇到了什么错误?
  • 什么系统?在各种 linuses 上,对您拥有的任何包管理器(apt、yum、rpm ...)使用包管理器查询开关。使用手册页或 --help。
  • 要使用 C++,您必须明确使用 clang++ 作为命令。
  • 类似的 Centos clang 问题记录在 stackoverflow.com/questions/25840088/…
  • 您的错误在别处。如果您显式链接 libc++ 并且它没有安装,链接器会告诉您它找不到 libc++。

标签: c++ cmake clang libc++


【解决方案1】:

比@n.n 更好的答案:

printf "#include <ciso646>\nint main () {}" | clang -E -stdlib=libc++ -x c++ -dM - | grep _LIBCPP_VERSION

如果打印出类似:#define _LIBCPP_VERSION 3700,那么你就得到了 libc++。

【讨论】:

  • 这一行更可取;至少在我的系统上,如果不重新输入整个命令,就无法更改 n.m. 的方法。你能解释一下其中的一些符号是什么,比如 和 -E -dM 吗?此外,我还要在具有许多 clang 构建版本的重要系统上添加这一点,您可以将“clang”替换为 path/to/particular-clang-build/bin/clang。
  • 关于#include<ciso646>,我将你推荐给stackoverflow.com/questions/31657499/…(有趣的是,这是对我给出的另一个答案的回应),clang++ -E -dM 告诉 clang 不要编译源代码,而只是为了预处理它(-E),然后打印出所有定义的东西(-dM
【解决方案2】:

检查是否安装了 libc++ 最直接的方法是在一个简单的程序上使用它:

 clang++ -xc++ -stdlib=libc++ - <<EOF
 int main(){}
 EOF

如果失败,则说明您没有 libc++。

在实际应用中,添加用户提供的编译器和链接器选项:

 clang++ $(CXXFLAGS) $(LDFLAGS) -xc++ -stdlib=libc++ - <<EOF

以便用户有机会指定 libc++ 安装在非标准位置。

【讨论】:

  • libc++ docs 提供了 $(CXXFLAGS) 和 $(LDFLAGS) 在实际应用中的详细信息。
【解决方案3】:

以下是检查是否安装了库的方法:

在终端中输入ldconfig -p | grep libc++。您使用什么系统并不重要。如果没有安装 libc++,终端不会说什么。如果已安装,它将显示可用版本。

【讨论】:

  • @okovko 看看这个。它将向您展示如何在系统上安装软件。试试吧。 ask.fedoraproject.org/en/question/7863/…之后,我们可以删除这个讨论,因为它已经过时了。
  • 安装一些新鲜的东西会很好,但这是不可能的,因为它不是我的系统。
  • @okovko 好吧,把它放在手边,以防万一你可以使用它。让我们删除这个讨论,因为它已经过时了。
【解决方案4】:

您可能会混淆 gcc 和 clang 都会这样做。要将代码编译为 C++,您必须使用 g++ 而不是 gcc,分别使用 clang++ 而不是 clang

我怀疑 libc++ 库本身是否丢失,因为几乎可以肯定某些程序依赖于它们。

【讨论】:

  • 嗯,这是关于设置编译器本身。 cmake可能会在内部调用clang而不是clang++,但我认为它应该有一些变量来设置编译器(make本身有一个)
  • 如果图书馆不见了,我会感到惊讶。如果得到指示,Gcc 应该能够链接到该库。
  • ...删除 cmets 和 downvoting 是完全不礼貌的!大声笑
猜你喜欢
  • 1970-01-01
  • 2011-10-06
  • 2017-11-14
  • 1970-01-01
  • 2021-11-23
  • 2017-04-13
  • 2012-03-28
  • 1970-01-01
  • 2012-05-29
相关资源
最近更新 更多