无法将 libc++ 与 clang++-5.0 一起使用

Posted

技术标签:

【中文标题】无法将 libc++ 与 clang++-5.0 一起使用【英文标题】:Unable to use libc++ with clang++-5.0 【发布时间】:2017-07-28 18:45:10 【问题描述】:

我已经安装了 clang++-5.0 来尝试新的 C++17 功能,但是为了获得完整的体验,我需要一个新的库。在找不到更新的 libstdc++ 之后,我决定尝试使用 libc++。

我已经使用here 描述的类似方式检查了它。

结帐后,我用clang自己编译了它,因为建议使用clang。编译没有问题。然后我安装了它,把它们放在/usr/local/include/c++/v1目录下。

当我尝试编译任何东西时,我收到一条错误消息,提示编译器找不到<stddef.h>。我解决了“重定向”包含的问题:-isystem /usr/local/include/c++/v1

但是链接器会抛出很多与异常和虚拟表相关的错误。在这种情况下我不知道该怎么办。

有办法解决吗?

我的设置:包含所有更新的 ubuntu 16.04 LTS、clang++-5.0、cmake-3.6。

这是我的旗帜:

set(CMAKE_CXX_FLAGS "$CMAKE_CXX_FLAGS -v -stdlib=libc++ -Wall -Wextra -pedantic-errors -std=c++1z -isystem /usr/local/include/c++/v1")

错误消息摘录:

//usr/local/lib/libc++.so: undefined reference to `__cxa_end_catch'
//usr/local/lib/libc++.so: undefined reference to `__cxa_pure_virtual'
//usr/local/lib/libc++.so: undefined reference to `__cxa_rethrow'
//usr/local/lib/libc++.so: undefined reference to `vtable for __cxxabiv1::__si_class_type_info'
//usr/local/lib/libc++.so: undefined reference to `vtable for __cxxabiv1::__class_type_info'
//usr/local/lib/libc++.so: undefined reference to `vtable for __cxxabiv1::__vmi_class_type_info'

更新:

在构建 libc++abi 后,它成功通过了构建步骤,但现在它崩溃并显示错误提示

加载共享库时出错:libc++abi.so.1: cannot open shared object file: No such file or directory

当前标志:

set(CMAKE_CXX_FLAGS "$CMAKE_CXX_FLAGS -isystem /usr/local/include/c++/v1 -stdlib=libc++ -lc++abi -Wall -Wextra -pedantic-errors -std=c++1z")

查看后发现/usr/lib/中没有它们,而/usr/local/lib中存在。

这是ldd program的输出:

linux-vdso.so.1 => (0x00007ffd1b7da000)

libc++abi.so.1 => /usr/local/lib/libc++abi.so.1 (0x00007f69bd322000)

libc++.so.1 => /usr/local/lib/libc++.so.1 (0x00007f69bcf80000)

libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f69bcc76000)

libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f69bca60000)

libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f69bc697000)

libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f69bc479000)

librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f69bc271000) /lib64/ld-linux-x86-64.so.2 (0x000055e63a9a9000)

【问题讨论】:

问题是链接过程中没有包含libc++abi.so。较新的 libc++ 版本的 libc++.so 文件应该是包含 INPUT(-lc++abi libc++.so.1) 的链接器脚本。这是你看到的吗?你在构建 Clang 和 libc++ 时是否包含了 libc++abi 存储库? clang++ -### -v -stdlib=libc++ -xc++ /dev/null 输出什么? 确保在 LLVM 树中再次编译 libc++abi 和 libc++。它应该看起来像这样:libcxx.llvm.org/docs/BuildingLibcxx.html#getting-started 什么崩溃?您是否像使用 libc++ 一样在 /usr/local/lib 中安装了 libc++abi? 但它在同一目录中找到 libc++.so? ldd <myprog> 的输出是什么? 我作为 libc++ 维护者的目标是让事情开箱即用,这样就没有人需要求助于堆栈溢出。随意写一个社区帖子,我绝对会审查它,但这里的真正目标是首先避免错误和对文档的需求。 【参考方案1】:

所以导致问题的原因实际上是我将部分留给了 libc++abi。大部分过程与docs中的规定相同,略有偏差。

我的过程大致如下:

结帐 llvm

检查 libc++ 和 libc++abi。记得结帐!

配置。我不确定它是否重要,但我使用发布配置构建了它,例如指定-DCMAKE_BUILD_TYPE=Release。另外,请确保它将使用 clang 本身进行编译。

两者都安装。它们可能位于/usr/local/lib/ 文件夹附近。

让编译器知道您需要 libc++。标志是-stdlib=libc++ -lc++abi。如果它会抱怨缺少<stddef.h>,请将-isystem path/to/includes/ 添加到编译器标志中,在我的例子中是-isystem /usr/local/include/c++/v1

【讨论】:

> 让编译器知道你想要 libc++。标志是-stdlib=libc++ -lc++abi。如果它会抱怨缺少<stddef.h>,请将-isystem path/to/includes/ 添加到编译器标志中,在我的例子中是-isystem /usr/local/include/c++/v1。标志是 -stdlib=libc++ -lc++abi 如果您正确构建了 clang/libc++/libc++abi,则不需要这些标志,除了 -stdlib=libc++ @EricWF:我可以确认在安装不会覆盖现有系统的新 libc++ 时需要 -isystem 标志。我在/usr/include 中有libc++-dev 3.7.0-1,在/usr/local/include 中有libc++-dev 3.9。 clang++ 尝试从/usr/local/include/c++/v1 包含,但由于缺少stddef.h 而失败。查看libcxx的SVN checkout,在include目录下确实没有stddef.h @SteveD,我今天检查了 llvm 源和 libc++,现在它可以正常工作了。不再需要传递-isystem 标志。尝试更新,如果可以复制我会修改我的发现。 @Incomputable:我现在已经开始工作了,所以我不急于进行任何更改 :)。但是,如果您发布您的步骤,我将通过它们查看它们是否有效。让这更容易将是一个巨大的帮助! @SteveD,和上面一样,只是去掉了-isystem部分。我没有安装它们,所以我必须通过-Wl,-rpath,/absolute/path 链接到共享库,如this answer 中指定的那样。它开箱即用,让我的测试人员的生活变得更加轻松。我认为简化它可能会牺牲很多灵活性,所以它可能不是一个选择。

以上是关于无法将 libc++ 与 clang++-5.0 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

使用带有 clang++ -stdlib=libc++ 的 libstdc++ 编译库

使用clang时在gdb中评估libc ++的方法

QtCreator:`clang:-stdlib=libc++ 的无效部署目标(需要 OS X 10.7 或更高版本)`

截至 2017 年的 clang 5.0 pdb 支持

在 Windows 上使用 libc++?

无法与忍者建立clang [重复]