【发布时间】:2016-06-17 16:09:43
【问题描述】:
我正在尝试在 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 构建这个项目。代码本身单独运行良好,因此问题似乎出在其他地方。
【问题讨论】:
-
标准库函数位于
std命名空间中。所以你需要打电话给std::log10。 -
@CodyGray 这也是我的第一个想法,我编辑了 OP 以反映我对该更改的结果。
-
#include <cmath> namespace math { template<typename T> inline T Log10(const T& x) { return T(log10(static_cast<double>(x))); } } // math int main() { auto t = math::Log10(10); return 0; }这对我来说似乎在 OSX 10.11 上编译得很好,你在什么版本上编译?你有没有指定任何编译-std? -
@kirinthos 10.11。有趣的是,您的代码 sn-p 也为我编译(在单独的测试文件中)。此应用程序使用
cmake,我对此的经验为零。该设置可能有问题吗? -
最肯定的是,你能不能发布一些——编辑:在 OSX cmake 文件上很常见的情况是 OSX sdk 分辨率的东西,你在生成一个 Xcode 项目吗?您可以打开项目并检查项目的构建设置以开始隔离它包含标头的位置,并可能找出未包含正确标头的原因
标签: c++ linux macos cmake c++-standard-library