Я установил clang ++ - 5.0, чтобы опробовать новые возможности C ++ 17, но для полноценного использования мне нужна новая библиотека. Не сумев найти более новую версию libstdc ++, я решил попробовать libc ++.
Я проверил это, используя аналогичный способ, описанный здесь.
После проверки я скомпилировал его с помощью самого 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: невозможно открыть файл общих объектов: нет такого файла или каталога
Текущие флаги:
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)
. Это то, что вы видите? Включили ли вы репозиторий libc ++ abi при сборке Clang и libc ++? Что выводитclang++ -### -v -stdlib=libc++ -xc++ /dev/null
? - person EricWF   schedule 09.03.2017/usr/local/lib
, как вы это сделали с libc ++? - person EricWF   schedule 09.03.2017ldd <myprog>
? - person EricWF   schedule 09.03.2017