Cygwin gcc.4.9.2: ошибка: '::lrintl' не объявлен

Этот вопрос связан с этой темой: поддержка cygwin для С++ 11 в g++4.9.2

У меня была такая же проблема:

error: ‘log2’ is not a member of ‘std’

Я применил предложенный патч, но получил еще одну ошибку. Включая cmath здесь

#include <cmath>
#include <iostream>
int main()
{
        std::cout << "hello" << std::endl;
}

возвращает эту ошибку

$ g++ -std=c++11 test.cpp
In file included from test.cpp:1:0:
/usr/lib/gcc/x86_64-pc-cygwin/4.9.2/include/c++/cmath:1107:11: error: '::lrintl' has not been declared
   using ::lrintl;
           ^
/usr/lib/gcc/x86_64-pc-cygwin/4.9.2/include/c++/cmath:1129:11: error: '::rintl' has not been declared
   using ::rintl;

Я попросил помощи на IRC-канале cygwin:

[23:02] <XXX> hi, has anyone had problems with gcc 4.9.2 in cygwin? i encountered the problem discussed here : https://cygwin.com/ml/cygwin/2015-03/msg00247.html
[23:03] <XXX> yet, if i apply the patch, i get another error: /usr/lib/gcc/x86_64-pc-cygwin/4.9.2/include/c++/cmath:1107:11: error: '::lrintl' has not been declared
[23:28] <YYY> long double functions are still missing on cygwin
[23:30] <XXX> so is there no way to make it work then?
[23:31] <YYY> sure, help add the missing functions to newlib/cygwin
[23:34] <XXX> i am not using any long double functions in my code -- so i assume including cmath does not work for anybody?
[23:35] <YYY> just drop the std:: instead
[23:37] <XXX> sorry, i'm not sure what you mean. remove 'std::' where ?

К сожалению, на этом разговор закончился. Я понятия не имею, куда я должен «отбросить std::», и решит ли это проблему. Может кто-нибудь помочь с этим?


person mkiesner    schedule 22.04.2015    source источник


Ответы (1)


Непропатченный <cmath> отлично работает здесь, если я это сделаю:

auto x = log2(10);

вместо:

auto x = std::log2(10);

Возможно, это то, что YYY имеет в виду под «удалить std::».

Если вы должны использовать исправленный <cmath>, вы можете либо закомментировать две оскорбительные строки, либо, если вы предпочитаете не изменять заголовок больше, чем вы уже сделали, добавьте несколько фиктивных определений rintl и lrintl, прежде чем включать его. Например:

#include <stdexcept>
long double rintl(long double arg) { throw std::runtime_error("rintl not implemented"); }
long lrintl(long double arg) { throw std::runtime_error("lrintl not implemented"); }

#include <cmath>
person peterdn    schedule 24.04.2015