Компиляция с Clang с использованием неопределенных ссылок Libc++


Первая пара слишком длинна, чтобы ссылаться на нее. Я получаю эту ошибку, когда пытаюсь скомпилировать 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 25

3 ответа:

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

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

Вы, вероятно, могли бы связать с GNU libstdc++

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

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

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

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