2017-01-06 3 views
1

Я не уверен, что вижу здесь. Ниже приведены результаты испытаний от старой версии PowerMac G5, работающей под управлением OS X 10.5.8. Его все еще вокруг для тестирования под крупным процессором PowerPC. Компилятор - это GCC 5.4, и его предоставляет MacPorts.error: 'log2' не входит в группу 'std'

Программа испытаний приведена ниже. При компиляции он приводит к ошибке error: 'log2' is not a member of 'std'.

$ cat test.cxx 
#include <cmath> 
int main(int argc, char* argv[]) 
{ 
    double d = std::log2(2.3456789f); 
    return 0; 
} 

Согласно Is std::log2() an extension or C++ standard?, std::log2 должны быть доступны.

Почему программа не может скомпилировать?


$ /opt/local/bin/g++-mp-5 --version 
g++-mp-5 (MacPorts gcc5 5.4.0_0) 5.4.0 
Copyright (C) 2015 Free Software Foundation, Inc. 

$ /opt/local/bin/g++-mp-5 -std=c++11 test.cxx -o test.exe 
test.cxx: In function 'int main(int, char**)': 
test.cxx:4:16: error: 'log2' is not a member of 'std' 
    double d = std::log2(2.3456789f); 
       ^
test.cxx:4:16: note: suggested alternative: 
In file included from /usr/include/math.h:26:0, 
       from /opt/local/include/gcc5/c++/cmath:44, 
       from test.cxx:1: 
/usr/include/architecture/ppc/math.h:431:15: note: 'log2' 
extern double log2(double); 
      ^

Это может быть связано из-за старого оборудования: C++11 cmath functions not in std namespace for android NDK w/gcc-4.8 or clang 3.4. Я понимаю, что Android - это другая платформа.


Теперь откройте в системе отслеживания проблем MacPorts: Issue 53226: PowerMac, GCC 5.4 and "error: 'std::log2' has not been declared".

Теперь откройте в системе отслеживания проблем GCC: Issue 79017: Old PowerMac G5, MacPorts GCC 5.4, C++11 and "std::log2 has not been declared"

+0

Учитывая вы на Mac, пожалуйста, убедитесь, что вы не используете 4.2 заголовки. –

+0

@BaummitAugen - Does * '... from/opt/local/include/gcc5/C++/cmath' * указывает его использование ожидаемого заголовка? – jww

+0

Просто FYI, я пробовал в OSX 10.11.4 (Intel i7) как с g ++ - 6 (устанавливается через Homebrew), так и с clang ++, и он компилируется и работает нормально. – fedepad

ответ

0

Why is the program failing to compile?

Отчет GCC на Issue 79017: Old PowerMac G5, MacPorts GCC 5.4, C++11 and "std::log2 has not been declared" получил хорошие отзывы от разработчиков GCC.

По Jonathan Wakely and the results of the program below:

test.cxx:53:21: error: 'llrint' was not declared in this scope 
llrint(0.0); 

test.cxx:54:23: error: 'llrintf' was not declared in this scope 
llrintf(0.0f); 

test.cxx:55:23: error: 'llrintl' was not declared in this scope 
llrintl(0.0l); 

test.cxx:56:22: error: 'llround' was not declared in this scope 
llround(0.0); 

test.cxx:57:24: error: 'llroundf' was not declared in this scope 
llroundf(0.0f); 

test.cxx:58:24: error: 'llroundl' was not declared in this scope 
llroundl(0.0l); 

Because these six functions are missing we treat all C99 math functions as missing. We could split the checks into two pieces, so we check for these separately, which would allow the rest of the C99 math library to be imported into namespace std.


#include <math.h> 
int main() { 
      typedef double_t my_double_t; 
      typedef float_t my_float_t; 
      acosh(0.0); 
      acoshf(0.0f); 
      acoshl(0.0l); 
      asinh(0.0); 
      asinhf(0.0f); 
      asinhl(0.0l); 
      atanh(0.0); 
      atanhf(0.0f); 
      atanhl(0.0l); 
      cbrt(0.0); 
      cbrtf(0.0f); 
      cbrtl(0.0l); 
      copysign(0.0, 0.0); 
      copysignf(0.0f, 0.0f); 
      copysignl(0.0l, 0.0l); 
      erf(0.0); 
      erff(0.0f); 
      erfl(0.0l); 
      erfc(0.0); 
      erfcf(0.0f); 
      erfcl(0.0l); 
      exp2(0.0); 
      exp2f(0.0f); 
      exp2l(0.0l); 
      expm1(0.0); 
      expm1f(0.0f); 
      expm1l(0.0l); 
      fdim(0.0, 0.0); 
      fdimf(0.0f, 0.0f); 
      fdiml(0.0l, 0.0l); 
      fma(0.0, 0.0, 0.0); 
      fmaf(0.0f, 0.0f, 0.0f); 
      fmal(0.0l, 0.0l, 0.0l); 
      fmax(0.0, 0.0); 
      fmaxf(0.0f, 0.0f); 
      fmaxl(0.0l, 0.0l); 
      fmin(0.0, 0.0); 
      fminf(0.0f, 0.0f); 
      fminl(0.0l, 0.0l); 
      hypot(0.0, 0.0); 
      hypotf(0.0f, 0.0f); 
      hypotl(0.0l, 0.0l); 
      ilogb(0.0); 
      ilogbf(0.0f); 
      ilogbl(0.0l); 
      lgamma(0.0); 
      lgammaf(0.0f); 
      lgammal(0.0l); 
      llrint(0.0); 
      llrintf(0.0f); 
      llrintl(0.0l); 
      llround(0.0); 
      llroundf(0.0f); 
      llroundl(0.0l); 
      log1p(0.0); 
      log1pf(0.0f); 
      log1pl(0.0l); 
      log2(0.0); 
      log2f(0.0f); 
      log2l(0.0l); 
      logb(0.0); 
      logbf(0.0f); 
      logbl(0.0l); 
      lrint(0.0); 
      lrintf(0.0f); 
      lrintl(0.0l); 
      lround(0.0); 
      lroundf(0.0f); 
      lroundl(0.0l); 
      nan(0); 
      nanf(0); 
      nanl(0); 
      nearbyint(0.0); 
      nearbyintf(0.0f); 
      nearbyintl(0.0l); 
      nextafter(0.0, 0.0); 
      nextafterf(0.0f, 0.0f); 
      nextafterl(0.0l, 0.0l); 
      nexttoward(0.0, 0.0); 
      nexttowardf(0.0f, 0.0f); 
      nexttowardl(0.0l, 0.0l); 
      remainder(0.0, 0.0); 
      remainderf(0.0f, 0.0f); 
      remainderl(0.0l, 0.0l); 
      remquo(0.0, 0.0, 0); 
      remquof(0.0f, 0.0f, 0); 
      remquol(0.0l, 0.0l, 0); 
      rint(0.0); 
      rintf(0.0f); 
      rintl(0.0l); 
      round(0.0); 
      roundf(0.0f); 
      roundl(0.0l); 
      scalbln(0.0, 0l); 
      scalblnf(0.0f, 0l); 
      scalblnl(0.0l, 0l); 
      scalbn(0.0, 0); 
      scalbnf(0.0f, 0); 
      scalbnl(0.0l, 0); 
      tgamma(0.0); 
      tgammaf(0.0f); 
      tgammal(0.0l); 
      trunc(0.0); 
      truncf(0.0f); 
      truncl(0.0l); 
      return 0; 
} 
Смежные вопросы