【问题标题】:error: 'log2' is not a member of 'std'错误:“log2”不是“std”的成员
【发布时间】:2017-05-20 17:36:20
【问题描述】:

我不确定我在这里看到了什么。下面的测试结果来自运行 OS X 10.5.8 的旧 PowerMac G5。它仍然可以在大端 PowerPC cpu 下进行测试。编译器为 GCC 5.4,由 MacPorts 提供。

测试程序如下。编译它会导致错误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"

【问题讨论】:

  • 鉴于您使用的是 Mac,请确保您没有使用 4.2 标头。
  • @BaummitAugen - ... from /opt/local/include/gcc5/c++/cmath 是否表明它使用了预期的标头?
  • 仅供参考,我在 OSX 10.11.4 (Intel i7) 中尝试了 g++-6(通过 Homebrew 安装)和 clang++,它编译并运行良好。
  • 它确实表明编译器选择了正确的标头(可能为时已晚)。您的设置以某种方式拙劣。不过我自己不是苹果人,所以我不能告诉你如何解决它。
  • @BaummitAugen - 谢谢。我认为这是与 GCC 或端口的不良交互。让我了解一下 MacPort 人员。

标签: c++ c++11 macports gcc5


【解决方案1】:

为什么程序编译失败?

Issue 79017: Old PowerMac G5, MacPorts GCC 5.4, C++11 and "std::log2 has not been declared" 的 GCC 报告从 GCC 开发人员那里得到了一些不错的 cmets。

根据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);   

由于缺少这六个函数,我们处理所有 C99 数学 功能缺失。我们可以把支票分成两份,所以我们 分别检查这些,这将允许 C99 数学的其余部分 要导入命名空间 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-23
    • 2020-02-02
    • 2014-08-27
    • 2021-09-07
    • 2013-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多