Что происходит с этим кодом в gcc-4.8?

0

Ошибки:

main.cpp: In function 'constexpr int fib(int)':
main.cpp:6:42: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     return (n < sizeof(ftbl)/sizeof(*ftbl)) ? ftbl[n] : fib(n-2) + fib(n-1);
                ^
/tmp/cch0aLwI.o: In function 'main':
main.cpp:(.text.startup+0xf): undefined reference to 'std::cout'
main.cpp:(.text.startup+0x16): undefined reference to 'std::ostream::operator<<(int)'
main.cpp:(.text.startup+0x2d): undefined reference to 'std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)'
main.cpp:(.text.startup+0x3c): undefined reference to 'std::cout'
main.cpp:(.text.startup+0x43): undefined reference to 'std::ostream::operator<<(int)'
main.cpp:(.text.startup+0x5a): undefined reference to 'std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)'
main.cpp:(.text.startup+0x69): undefined reference to 'std::cout'
main.cpp:(.text.startup+0x70): undefined reference to 'std::ostream::operator<<(int)'
main.cpp:(.text.startup+0x87): undefined reference to 'std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)'
/tmp/cch0aLwI.o: In function '_GLOBAL__sub_I_main':
main.cpp:(.text.startup+0xaa): undefined reference to 'std::ios_base::Init::Init()'
main.cpp:(.text.startup+0xb9): undefined reference to 'std::ios_base::Init::~Init()'
collect2: error: ld returned 1 exit status

Он работает без проблем в clang.

Пример был взят со страницы 312 новой книги B.Stroustrup "TCPL".

#include <iostream>

constexpr int ftbl[] { 1, 2, 3, 5, 8, 13 };
constexpr int fib(int n)
{
    return (n < sizeof(ftbl)/sizeof(*ftbl)) ? ftbl[n] : fib(n-2) + fib(n-1);
}

int main()
{
    std::cout << fib(1) << '\n';
    std::cout << fib(2) << '\n';
    std::cout << fib(6) << '\n';
}

Компилятор invokation: gcc-4.8 -std=c++11 -O2 -pedantic -pthread -Wall main.cpp &&./a.out

  • 10
    используйте g ++ вместо gcc: coliru.stacked-crooked.com/a/2b157d362791bec4
  • 0
    @ Stefan Отлично. Я приму это как ответ.
Показать ещё 2 комментария
Теги:
c++11
gcc
constexpr

1 ответ

5
Лучший ответ

Используйте g++ вместо gcc.

Кроме того, вы можете связать стандартную библиотеку, если хотите. Вы должны положить его в конец, хотя из-за привязки порядка.

gcc-4.8 -x c++ -std=c++11 -O2 -pedantic -Wall -pthread main.cpp -lstdc++  && ./a.out

Ещё вопросы

Сообщество Overcoder
Наверх
Меню