尝试在Xcode中构建包含<cmath>
的小而简单的项目时出现以下错误:
cmath: '*' has not been declared
'::acos' has not been declared
In file included from /Xcode4/Projects/libraryLAFMath/Classes/libraryLAFMath.cp
In file included from /Xcode4/Projects/libraryLAFMath/Classes/libraryLAFMath.h
'::acos' has not been declared in /Xcode4/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.1.sdk/usr/include/c++/4.2.1/cmath
...
错误日志也会抱怨所有其他数学函数sin
,pow
等,而不仅仅是acos
。我查看了cmath
源代码,它引用了来自math.h
的全局定义的相应数学函数,即::acos
等。由于根错误抱怨::acos
不存在一个人会认为找不到math.h
,但a)它存在,并且b)我得到一个不同的错误,抱怨math.h找不到。
源代码如下:
libraryLAFMath.cp:
#include "libraryLAFMath.h"
libraryLAFMath.h:
#include <cmath>
struct libraryLAFMath {
void test() {
double a = std::acos(0);
}
};
现在,我有一个来自外部源的另一个使用cmath
的项目并且编译得很好。我尝试比较这两个项目之间的构建设置,但它们几乎相同。我正在使用LLVM GCC 4.2编译器,但在使用GCC 4.2时得到类似的结果,所以我认为这不是编译器设置问题。
我是Xcode开发的新手,感谢任何帮助。
答案 0 :(得分:13)
我的项目中有一个名为Math.h
且资本为M
的文件,似乎编译器感到困惑并试图包含Math.h
而不是math.h
答案 1 :(得分:2)
我在这个主题的另一个帖子上发布了这个答案,但是认为值得包括在这里:
我遇到了这个问题 - 它让我发疯,但我追查了原因,这与我在这个问题上所见的报道有点不同。
在这种情况下,一般的cmath标头(或math.h - 错误和解决方案发生在C ++或C中)具有架构环境开关,以包括特定于体系结构的数学子标头。架构开关(环境变量)还没有被定义,所以它正在发挥作用,实际上并没有包括真正定义数学函数的标题。
所以确实有一个math.h或cmath.h,它包含在内,但这还不足以获得数学函数。在我的例子中,我没有定义架构变量,而是找到了正确的子数学头的位置,并将它们添加到我的编译路径中。然后项目工作了!
这似乎是将Linux项目移植到OS-X时出现的问题。我想象在平台之间移动项目时可能会发生这种情况,以至于标准库标题的排列方式不同。