无法将 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++ 编译库
QtCreator:`clang:-stdlib=libc++ 的无效部署目标(需要 OS X 10.7 或更高版本)`