7

尝试构建包含<cmath>在 Xcode 中的小而简单的项目时,出现以下错误:

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
...

错误日志还抱怨所有其他数学函数sinpow, 等,而不仅仅是acos. 我查看cmath了源代码,它引用了全局定义的相应数学函数math.h,即::acos等。由于根错误抱怨不存在::acos一个会假设math.h找不到,但是a)它存在,b)我会得到一个不同的错误,抱怨找不到 math.h。

源代码如下:

图书馆LAFMath.cp:

#include "libraryLAFMath.h"

图书馆LAFMath.h:

#include <cmath>
struct libraryLAFMath {
    void test() {
        double a = std::acos(0);
    }
};

现在,我有另一个来自外部来源的项目,可以cmath正常使用和编译。我尝试比较这两个项目之间的构建设置,但它们几乎相同。我正在使用 LLVM GCC 4.2 编译器,但是在使用 GCC 4.2 时得到了类似的结果,所以我相信这不是编译器设置问题。

我是 Xcode 开发的新手,不胜感激。

4

2 回答 2

13

我的项目中Math.h有一个以大写字母命名的文件M,编译器似乎感到困惑并试图包含Math.h而不是math.h.

于 2010-10-15T07:04:28.697 回答
2

我在关于该主题的另一个线程上发布了这个答案,但认为它也值得包括在这里:

我遇到了这个问题 - 它让我发疯,但我找到了原因,这与我看到的关于这个问题的报道有点不同。

在这种情况下,通用 cmath 标头(或 math.h - C++ 或 C 中出现的错误和解决方案)具有架构环境切换以包含架构特定的数学子标头。体系结构开关(环境变量)尚未定义,因此它是下注,实际上并未包括真正定义数学函数的标头。

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

在将 Linux 项目移植到 OS-X 时,这似乎是一个经常出现的问题。我想它可能会在项目在平台之间移动的任何时候发生,这样标准库头文件的排列方式就会不同。

于 2013-09-23T20:13:54.813 回答