Компиляция с Clang с использованием неопределенных ссылок на Libc ++ - PullRequest
27 голосов
/ 10 августа 2011

Первая пара слишком длинна для ссылки.Я получаю эту ошибку, когда пытаюсь скомпилировать clang++ -stdlib=libc++ ../main.cc ... с помощью clang и libc ++ из SVN.

error: undefined reference to 'typeinfo for char const*'
error: undefined reference to '__cxa_allocate_exception'
error: undefined reference to '__cxa_throw'
/tmp/cc-pbn00y.o:../main.cc:function std::__1::deque<double, std::__1::allocator<double> >::__add_back_capacity(): error: undefined reference to '__cxa_begin_catch'
/tmp/cc-pbn00y.o:../main.cc:function std::__1::deque<double, std::__1::allocator<double> >::__add_back_capacity(): error: undefined reference to '__cxa_rethrow'
/tmp/cc-pbn00y.o:../main.cc:function std::__1::deque<double, std::__1::allocator<double> >::__add_back_capacity(): error: undefined reference to '__cxa_end_catch'
/tmp/cc-pbn00y.o(.eh_frame+0xbd3): error: undefined reference to '__gxx_personality_v0'

РЕШЕНИЕ: Благодаря одному из ответов я знаю решение. libc ++ не может использоваться сам по себе, как libstdc ++, он должен быть связан с libc ++ abi .Тем не менее, libc ++ abi еще не завершена, поэтому использование libc ++ кажется на данный момент немного неполным, но это все равно мой первый выбор, когда он завершится.

ОБНОВЛЕНИЕ 5/26 /2012: libc ++ abi теперь готов для C ++, и я успешно использую clang ++ следующим образом clang++ -std=c++11 -stdlib=libc++ -lc++abi.

Ответы [ 3 ]

14 голосов
/ 10 августа 2011

Я считаю, что libc ++ пока не поддерживает все функции исключений.См. Страницу состояния:

http://libcxxabi.llvm.org/spec.html

Возможно, вы могли бы связать с libstdc gnu ++

4 голосов
/ 29 мая 2015

Вот что у меня работает с пакетами Ubuntu Vivid для clang и libc ++:

clang++ -std=c++11 -stdlib=libc++ <object files> -lc++abi -lsupc++

Важно, чтобы объектные файлы были перед флагами -l, например, когда вы используете исключения.Очевидно, что это все равно не будет связываться, если вы используете библиотеки, скомпилированные с libstdc ++, и используете любые типы STL в этих интерфейсах.

2 голосов
/ 10 августа 2011

Похоже, вы используете обработку исключений, но она не включена в компиляторе. Попробуйте передать -fexceptions в командную строку.

...