首页 文章

无法使用libc和clang -5.0

提问于
浏览
2

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

我用here描述的类似方式检查了它 .

结帐后,我用clang本身编译它,因为它被建议使用clang . 编译没有问题 . 然后我安装它,将它们放在 /usr/local/include/c++/v1 目录中 .

当我尝试编译任何东西时,我收到一个错误,说编译器找不到 <stddef.h> . 我用"redirecting"解决了问题包括: -isystem /usr/local/include/c++/v1 .

但随后链接器抛出了许多与异常和虚拟表相关的错误 . 我不知道在这种情况下该怎么做 .

有可能解决它吗?

我的设置:ubuntu 16.04 LTS包含所有更新,铿锵-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'

UPDATE:

在构建libc abi之后,它成功地通过了构建步骤,但现在它因错误而崩溃了

加载共享库时出错:libc abi.so.1:无法打开共享对象文件:没有这样的文件或目录

目前的旗帜:

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)

1 回答

  • 2

    所以导致问题的是我离开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 .

相关问题