我编写了一个使用Fast Light Toolkit的小程序,出于某种原因,在尝试访问cmath头中的函数时会产生编译器错误。
如错误:: acos尚未声明。
这几乎是它尝试在标题中使用的每个函数。我能错过什么?
我包含的头文件是
Simple_window.h
Graph.h
这两者都是FLTK的一部分。
代码是这样的:
#include "Simple_window.h" // get access to our windows library
#include "Graph.h" // get access to graphics library facilities
int main()
{
using namespace Graph_lib; // our graphics facilities are in Graph_lib
Point tl(100,100); // to become top left corner of window
Simple_window win(tl,600,400,"Canvas"); // make a simple window
Polygon poly; // make a shape (a polygon)
poly.add(Point(300,200)); // add a point
poly.add(Point(350,100)); // add another point
poly.add(Point(400,200)); // add a third point
poly.set_color(Color::red); // adjust properties of poly
win.attach(poly); // connect poly to the window
win.wait_for_button(); // give control to display engine
}
编辑:以下是生成编译器错误的示例代码。这是在cmath标题内。
namespace std
{
// Forward declaration of a helper function. This really should be
// an `exported' forward declaration.
template<typename _Tp> _Tp __cmath_power(_Tp, unsigned int);
inline double
abs(double __x)
{ return __builtin_fabs(__x); }
inline float
abs(float __x)
{ return __builtin_fabsf(__x); }
inline long double
abs(long double __x)
{ return __builtin_fabsl(__x); }
using ::acos; //ERROR HERE
inline float
acos(float __x)
{ return __builtin_acosf(__x); }
inline long double
acos(long double __x)
{ return __builtin_acosl(__x); }
template<typename _Tp>
inline typename __enable_if<double, __is_integer<_Tp>::_M_type>::_M_type
acos(_Tp __x)
{
return __builtin_acos(__x);
}
编辑:Code :: blocks将文件保存为C文件....
答案 0 :(得分:3)
当您包含标准C库的C ++版本(&lt; cXXXX&gt;)时,所有符号都在std命名空间中定义。在C ++中,您不需要链接数学库(不需要-lm)
#include <cmath>
#include <iostream>
int main()
{
std::cout << std::fabs( -10.5 ) << std::endl;
}
答案 1 :(得分:1)
我遇到了这个问题 - 这让我发疯了,但我追查了原因,这与我在这个问题上看到的报道有点不同。
在这种情况下,一般的cmath标头(或math.h - 错误和解决方案发生在C ++或C中)具有架构环境开关,以包括特定于体系结构的数学子标头。架构交换机(环境变量)尚未定义,因此它正在发挥作用,实际上并不包括真正定义数学函数的头文件。
所以确实有一个math.h或cmath.h,它包含在内,但这还不足以获得数学函数。在我的例子中,我没有定义架构变量,而是找到了正确的子数学头的位置,并将它们添加到我的编译路径中。然后项目工作了!
这似乎是将Linux项目移植到OS-X时出现的问题。我想,任何时候项目都可以在平台之间移动,以便标准库标题的排列方式不同。
答案 2 :(得分:0)
由于您上面显示的代码没有直接调用acos()
,因此您可以使用其中一个标头中的错误。看来在其中一个头中有一些(内联)代码调用acos()
函数,而不确保函数被正确声明。这可能是宏或内联函数。
最好的解决方法是确保标题是自包含的 - 更改标题。
如果无法做到这一点,那么解决方法是在源代码中包含适当的标题(#include <cmath>
)。
程序能够访问cmath标头,错误在cmath标头本身。
在这种情况下,您可能需要提供调用acos()
的全局std::acos()
函数(至少声明,也可能是定义):
double acos(double x) { return std::acos(x); }
确保它不在任何命名空间内 - 甚至不是匿名命名空间。 (检查在MacOS X上用G ++ 4.0.1编译,前面有'#include <cmath>
'。鉴于你有一个有问题的<cmath>
标题,你可能需要得到它的幻想:
extern double std::acos(double);
double acos(double x) { return std::acos(x); }
#include <cmath>
这非常讨厌 - 你确定你的编译器没有错误修复版本吗?
您是否有机会在命名空间中获得“#include <cmath>
”?
答案 3 :(得分:0)
错误最有可能出现在您的代码中而不是cmath中...除非您在cmath中更改了某些内容。你能复制错误并告诉我们你用来编程的应用程序是什么?
答案 4 :(得分:0)
在Visual C ++中,在不使用cmath
的程序中也会发生这种情况。
我发现问题在于我使用main.c
文件而不是main.cpp
文件。