在OS X上编译Linux应用程序 - 找不到标准库(cmath)

时间:2016-06-17 16:09:44

标签: c++ linux macos cmake c++-standard-library

我试图在OS X上构建一个在Linux上编写的应用程序,但我在助手文件中遇到了大量错误。帮助器是cmath形式的包装器:

#include <cmath>

namespace [application name]
{   
  namespace math
  {
    template<typename T>
    inline T Log10(const T& x)
    {
      return T(log10(static_cast<double>(x)));
    }
  }
}

我收到错误的表格:

/pathtofile/common/math/Helpers.t:132:16: error: use of undeclared identifier 'log10'; did you mean 'Log10'?
  return T(log10(static_cast<double>(x)));
           ^
/pathtofile/common/math/Helpers.t:130:14: note: 'Log10' declared here
inline T Log10(const T& x)

我已经对这个问题进行了一些研究,Stack Overflow上的人说了以下内容:

  

我遇到了这个问题 - 它让我发疯,但我追查了原因,这与我在这个问题上所见的报道有点不同。

     

在这种情况下,一般的cmath标头(或math.h - 错误和解决方案发生在C ++或C中)具有架构环境开关,以包括特定于体系结构的数学子标头。架构开关(环境变量)还没有被定义,所以它正在发挥作用,实际上并没有包括真正定义数学函数的标题。

     

所以确实有一个math.h或cmath.h,它包含在内,但这还不足以获得数学函数。在我的例子中,我没有定义架构变量,而是找到了正确的子数学头的位置,并将它们添加到我的编译路径中。然后项目工作了!

     

这似乎是将Linux项目移植到OS-X时出现的问题。我想象在平台之间移动项目时可能会发生这种情况,这样标准库标题的排列方式就不同了。

这是问题吗?如果是这样,我该如何解决这个问题(我不确定如何遵循他的建议)?

编辑:如果我通过命名空间std引用数学函数,我会得到以下结果:

/pathtofile/common/math/Helpers.t:62:14: error: no member named 'acos' in namespace 'std'; did you mean 'ACos'?
  return std::acos(x);
         ^~~~~
/pathtofile/common/math/Helpers.t:60:14: note: 'ACos' declared here
inline T ACos(const T& x)

Edit2:如果它相关,我试图用cmake 3.0构建这个项目。代码本身可以单独运行,因此问题似乎在其他地方。

1 个答案:

答案 0 :(得分:1)

$ cat > chk.cpp
#include <cmath>

namespace app
{
    namespace math
    {
        template<typename T>
        inline T Log10(const T& x)
        {
            return T(log10(static_cast<double>(x)));
        }
    }
}

int main()
{

    return app::math::Log10(100.0);
}
$ c++ -std=c++14 chk.cpp
$ ./a.out
$ echo $?
2

我认为问题不在这里。