2014-01-19 3 views
0

я могу скомпилировать и запустить C++, например, в командной строке, как это:Eclipse CDT с llvm's libC++ компиляция err под ubuntu?

clang++ -std=c++11 -stdlib=libc++ Test.cpp 

Но при попытке это затмение, я получил эти ошибки

12:58:18 **** Incremental Build of configuration Debug for project C++Test **** 
Info: Internal Builder is used for build 

clang++ -L/usr/lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.8/ -o 
C++Test src/C++Test.bc -llibc++ -lstdc++ 

/usr/bin/ld: cannot find -llibc++ 

clang: error: linker command failed with exit code 1 (use -v to see invocation) 

Есть две странные вещи здесь:

Во-первых, я действительно добавил «-std = C++ 11 -stdlib = libC++» для компиляции команды в настройках сборки проекта, но, похоже, ее игнорируют. Почему?

Во-вторых, у меня есть удалить STDC++ из библиотек, но он будет добавлен автоматически каждый раз, как это:

Update: добавить картинку к демонстрационному эту проблему stdc++ will be added automatically again after deleting

Затем я пытался удалить LibC++ из библиотек в настройках проекта, скомпилировать его снова, получил кучу ошибок, как это:

Info: Internal Builder is used for build 
clang++ -L/usr/lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.8/ -o C++Test src/C++Test.bc -lstdc++ 
/tmp/C++Test-d24e4c.o: In function `main': 
/home/alex/workspace/C++Test/Debug/../src/C++Test.cpp:12: undefined reference to `std::__1::cout' 
/tmp/C++Test-d24e4c.o: In function `std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::operator<< <std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*)': 
/usr/include/c++/v1/ostream:974: undefined reference to `std::__1::basic_ostream<char, std::__1::char_traits<char> >::sentry::sentry(std::__1::basic_ostream<char, std::__1::char_traits<char> >&)' 
/tmp/C++Test-d24e4c.o: In function `std::__1::basic_ios<char, std::__1::char_traits<char> >::fill() const': 
/usr/include/c++/v1/ios:734: undefined reference to `std::__1::ios_base::getloc() const' 
...... 

«-std = C++ 11 -stdlib = libC++ "все еще игнорируется, и как заставить его работать?

ответ

2

Передовой проблема в том, почему линкер не может найти libc++:

Если вы хотите связать динамическую библиотеку, скажем, libfoo.so с -l флагом, вы используете опцию -lfoo, не -llibfoo. Поэтому для ссылки libc++ вы используете опцию -lc++, а не -llibc++, как вы это сделали. В ваших библиотеках проекта (-l), замените libc++ на c++.

Вторичная проблема состоит в том, что Eclipse, CDT генерируемые команды ссылка:

clang++ -L/usr/lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.8/ -o 
C++Test src/C++Test.bc -llibc++ -lstdc++ 

пытается связать libstdc++ (ССЗ Стандарт C++ библиотека), а также (то, что, как предполагается,) libc++ (библиотека LLVM Standard C++). Вы хотите ссылке той или другой, а не как:

Вы говорите, что даже если вы удалите stdc++ из библиотек проекта, он автоматически добавляется сборки Eclipse. Я не могу воспроизвести эту проблему. Возможно, вы можете дважды проверить это:

  • Удалить stdc++ из библиотеки проекта и применить эти изменения.

  • Затем посмотрите на настройки компоновщика ->Все варианты и посмотреть, если -lstdc++ появляется там. Это не должно.

  • Если это так, посмотрите на настройки компоновщика ->Разное ->компоновщика флаги и Другие варианты. Появляется ли -lstdc++? Если да, удалите его.

  • В противном случае посмотрите на линкеру Параметры эксперта: шаблон командной строки. Если он содержит -lstdc++, удалите его.

Вы также сказать, что вы приложили опции -std=c++11 -stdlib=libc++ в командной настройки компилятора , но это, кажется, игнорируется. Они могут быть , по-видимому, игнорируются, потому что только шаг ссылки вашего проекта не работает, поэтому шаг компиляции не повторяется при создании. Однако это заблуждение, чтобы добавить эти опции в команду компиляции: -

  • -std=c++11 является компилировать вариант. Вы должны добавить его в компилятор -> Разное ->Другие флаги.

  • -stdlib=libc++ является связь вариант и, при желании, должны быть добавлены к линкера ->Разное ->флаги компоновщика. Однако это является излишним использовать этот параметр, если вы также ссылаетесь на -lc++ (и не link -lstdc++), а -lc++ - более надежный вариант. Я предлагаю вам не беспокоить -stdlib=libc++.

С учетом ваших трудностей, связывающих с libc++ нужно спросить: Есть ли у вас действительно нужно? Тот факт, что вы строите с clang, не обязывает вас для ссылки libc++. Клэнг вполне счастливо свяжет libstdc++.

+0

Спасибо, почти слова now.But я удалил «stdC++» из библиотек, а все параметры компоновщика: -L/usr/lib -L/usr/local/lib -L/usr/lib/gcc/x86_64 -linux-gnu/4.8.1 -L/usr/lib/x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.8 /. –

+0

И после удаления «stdC++» примените панель «Закрыть настройки», затем немедленно откройте настройки, «stdC++» будет автоматически добавлен eclipse, и в настройках ничего нет -> Разное -> флаги Linker и другие параметры –

+0

См. Обновленный ответ и проверьте настройки линкера * Эксперт *. Это помогает? –

Смежные вопросы