【问题标题】:What's happening with this code in gcc-4.8? [closed]gcc-4.8 中的这段代码发生了什么? [关闭]
【发布时间】:2014-03-20 08:22:09
【问题描述】:

错误:

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中执行没有问题。

示例取自 B.Stroustrup 的新书《TCPL》的第 312 页。

#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';
}

编译器调用:gcc-4.8 -std=c++11 -O2 -pedantic -pthread -Wall main.cpp &amp;&amp; ./a.out

【问题讨论】:

  • @stefan 完美。我会接受这个作为答案。
  • 这里实际上不需要答案,因为修复只是印刷。有同样问题的用户可能不会找到这个 Q/A,而是问他们自己的问题。因此,我建议关闭这个问题(我已经标记了它)。
  • 要修复未签名的警告并做到彻底,请添加另一个 ?运算符检查 n

标签: c++ gcc c++11 constexpr


【解决方案1】:

使用g++ 而不是gcc

或者,您可以根据需要链接标准库。由于链接顺序,您需要将其放在最后。

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

【讨论】:

猜你喜欢
  • 2014-11-12
  • 2016-06-09
  • 2018-07-28
  • 1970-01-01
  • 2013-01-24
  • 2012-08-29
  • 2012-07-26
  • 2014-09-28
相关资源
最近更新 更多