2017-01-06 211 views
1

我不確定我在這裏看到的是什麼。下面的測試結果來自運行OS X 10.5.8的老式PowerMac G5。它仍然在大端PowerPC cpu下進行測試。編譯器是GCC 5.4,由MacPorts提供。錯誤:'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 - 從*/opt/local/include/gcc5/C++/cmath * * * ...表明它使用期望的頭文件嗎? – jww

+0

只是FYI,我嘗試在OSX 10.11.4(英特爾i7)與g ++ - 6(通過Homebrew安裝)和鏗鏘++,它編譯和運行良好。 – 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開發者一些很好的意見。

根據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; 
} 
相關問題