Кодовые блоки успешно скомпилированы, но gcc не сработает. Почему? - PullRequest
1 голос
/ 07 июля 2019

Я использую Ubuntu 18. Я установил кодовые блоки ide и голый компилятор gnu gcc (командная строка)

gcc версия 7.4.0 (Ubuntu 7.4.0-1ubuntu1 ~ 18.04.1)

кодовые блоки 16.01

Я написал очень простой код для создания и печати строковой переменной

Блоки кода (со встроенным компилятором gnu gcc) успешно скомпилированы. Но голый компилятор gcc не справляется

Я пытался включить iostream и stdio также

#include <string>
using namespace std;

int main() {
    string a = "I am learning C++";
    printf("%s",a.c_str());
    return 0;
}

codeblocks успешно компилирует его и выдает результат без сообщения об ошибке. Как и Sololearn онлайн-компилятор также

Я учусь C ++

Я попал в папку, где находится файл cpp и дал следующую команду

gcc string_var.cpp -o string_var.out

Bt голый компилятор gcc дает много длинных ошибок компилятора, которые я не могу понять

/tmp/ccen8bfp.o: In function `main':
string_var.cpp:(.text+0x20): undefined reference to `std::allocator<char>::allocator()'
string_var.cpp:(.text+0x37): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)'
string_var.cpp:(.text+0x43): undefined reference to `std::allocator<char>::~allocator()'
string_var.cpp:(.text+0x4f): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::c_str() const'
string_var.cpp:(.text+0x74): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()'
string_var.cpp:(.text+0x96): undefined reference to `std::allocator<char>::~allocator()'
string_var.cpp:(.text+0xb0): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()'
/tmp/ccen8bfp.o:(.data.rel.local.DW.ref.__gxx_personality_v0[DW.ref.__gxx_personality_v0]+0x0): undefined reference to `__gxx_personality_v0'

collect2: error: ld returned 1 exit status

Ответы [ 2 ]

1 голос
/ 07 июля 2019

Коллекция компиляторов GNU (GCC) может использоваться для компиляции множества разных языков. Некоторые из этих языков достаточно распространены, чтобы использовать одну и ту же программу интерфейса.

C и C ++ - два таких языка, и оба могут быть скомпилированы с помощью внешней программы gcc. Тем не менее, программа gcc по умолчанию предназначена для кода C, и поэтому не используйте некоторые флаги, необходимые для сборки программ C ++. Одним из таких недостатков является то, что gcc не связывается со стандартной библиотекой C ++.

Вы можете решить эту проблему, явно связавшись с библиотекой:

gcc string_var.cpp -o string_var.out -lstdc++

Или, что еще проще, использовать интерфейсную программу для C ++, g++:

g++ string_var.cpp -o string_var.out
0 голосов
/ 07 июля 2019
gcc string_var.cpp -o string_var.out

gcc - компилятор Си.Вы хотите скомпилировать код C ++:

g++ string_var.cpp -o string_var.out

Просто так получается, что gcc или g++ работает, поскольку компилирует фактический код, компилятор понимает, что .cpp файлы содержат код C ++, ипоступает соответствующим образом.

Однако, когда время связывается с полученным объектным модулем, gcc не предоставляет библиотеку C ++ во время выполнения для компоновщика (он по-прежнему думает, что это просто компилятор C, и никогда не слышал о C ++), что привело к сбою ссылки.

...