2017-01-06 10 views
1

여기에서 내가 무엇을 보는지 확신 할 수 없습니다. 아래의 테스트 결과는 OS X 10.5.8을 실행하는 이전 PowerMac G5의 결과입니다. 빅 엔디안 PowerPC cpu에서 테스트를 계속합니다. 컴파일러는 GCC 5.4이며 MacPorts에서 제공합니다.오류 : 'log2'는 '표준'의 구성원이 아닙니다.

테스트 프로그램은 다음과 같습니다. 컴파일하면 오류가 발생합니다. 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

당신이 맥 감안할 때, 당신은 4.2 헤더를 사용하지 않는 확인하십시오. –

+0

@BaummitAugen - */.../opt/local/include/gcc5/C++/cmath' *는 예상 헤더를 사용하고 있습니까? – jww

+0

참고로, 나는 OSX 10.11.4 (Intel i7)에서 g ++ - 6 (Homebrew를 통해 설치됨)과 clang ++ 모두에서 컴파일을 시도하고 잘 실행되었다. – fedepad

답변

0

Why is the program failing to compile?

Issue 79017: Old PowerMac G5, MacPorts GCC 5.4, C++11 and "std::log2 has not been declared"에서 GCC 보고서는 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; 
}