在Xcode中编译C++类时出现错误: 编译期间出现STL向量错误。

11

我有一个C++类,在Linux使用gcc编译时和在Windows的Visual Studio中编译都可以正常运行。

boid.h:

#ifndef BOID_CLASS_HEADER_DEFINES_H
#define BOID_CLASS_HEADER_DEFINES_H
#include "defines.h"

class Boid {

public:
     // Initialize the boid with random position, heading direction and color
     Boid(float SceneRadius,float NormalVel);

     .....
protected:
     ...
};

#endif

而在 boid.cpp 中:

#include "Boid.h"

// Initialize the boid with random position, heading direction and color
Boid::Boid(float SceneRadius,float NormalVel) 
{
    ....
}

然而,当我在Xcode编译此代码时,我收到以下错误:

Compiling Boid.h: "error: vector: No such file or directory"
任何想法?我以为你可以在Xcode中编译C/C++代码而不会有问题?
谢谢。
编辑:添加了defines.h(示例中也添加了#endif,但这是原始代码中的)
编辑2:在注释掉一些空的包含文件之后,我遇到了一个不同的错误:上面的vector错误。
#ifndef BOID_NAV_DEFINES_H
#define BOID_NAV_DEFINES_H
#include <stdlib.h>
#include <vector>
#include "Vector3d.h"
#include "Point3d.h"
#include "win_layer.h"
#endif

win_layer被注释掉了,我缺少一些函数,但现在它是空的,我将从项目中排除它。 - cbrulak
现在我在使用向量时遇到了一个错误:"错误:向量:没有这个文件或目录"。 - cbrulak
8个回答

24

您是否将C++头文件包含在.m文件中?

.m文件被视为具有Objective-C扩展名的.c文件。

.mm文件被视为具有Objective-C扩展名的.cpp文件,然后被称为Objective-C++。

只需将任何.m文件重命名为.mm,右键单击或Ctrl + 单击Xcode中的文件并选择重命名即可。


我在Xcode中找不到重命名选项,所以我在Finder中复制了该文件,将其重命名为.mm,然后在Xcode项目中删除了.m文件,并最终将.mm文件添加到Xcode项目中。 - dumbledad
现在,你可以在Xcode中选择一个文件,然后再次选择它,这时文件名就可以编辑了。 - epatel

18

不需要将任何 .m 文件更改为 .mm 或其他类似的文件,如果您点击项目,然后点击目标->生成设置 一直向下滚动到 "LLVM GCC 4.2 - 语言"(新版本的 Xcode 中称为 "Apple LLVM 编译器 4.2"),你会看到 编译源代码为 将该值更改为 Objective-C++


4

希望这能有所帮助。 在将xCode更新到版本10后,我遇到了包括< map >和< vector >库在内的问题。通过更改项目的构建设置(目标的“构建设置”)中的C++库类型找到了一个简单的解决方案:

C++标准库:libc++(带有C++ 11支持的LLVM C++标准库)

编译没有任何问题。


2

请确保将其编译为C++。在XCode中右键单击文件,选择获取信息,并确保实现文件的文件类型设置为sourcecode.cpp.cpp


1

假设你在谈论的是OS X XCode,那么它使用gcc进行实际编译。因此,除了可能有不同版本的gcc之外,在Linux和OS X之间应该没有区别。

我在这里首先注意到的是,您将文件名输入为“boid.h”,但是您正在包含“Boid.h”。假设这不是笔误,我会预计这会在Linux和OS X上都引起问题....

编辑以回答新问题:嗯...向量(vector)绝对是Xcode的一部分:/Developer/SDKs/MacOSX10.5.sdk/usr/include/c++/4.0.0/vector 在我的机器上。

进一步思考:如果您将源代码和makefile从Linux构建移植到Mac上,您可能可以像在Linux上一样从命令行编译它....


0

肯定是defines.h中的某些内容影响了类定义。


0

这个问题有两个错误:

  • 我的一个包含文件中有一个打字错误,导致编译错误
  • 将.m文件更改为.mm后,向量未找到的错误已经解决

嗨,我已经接受了正确的答案(在你的评论后)。抱歉耽搁了。 - cbrulak

0

不确定你是否忘记粘贴,但你有一个未终止的#ifndef

defines.h里面是什么?

编辑:你似乎已经找到了解决方案。还有一点要注意:

#include <stdlib.h>

请使用C++:

#include <cstdlib>

:D


将defines.h添加到问题中,同时,#endif在原始代码中。 - cbrulak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接