在Xcode 4.2中出现了“未找到包括<string>”的编译错误。

18

我在XCode中遇到了include未找到的编译错误。我的iOS应用程序项目使用了Objective-c和c++混合编程。

一开始,我在我的iOS项目中创建了一个.h文件和一个.cpp文件。然后,我将.cpp文件重命名为.mm文件。

这是我的.h文件:

TestLog.h

#ifndef CalculatorDemo_TestLog_h
#define CalculatorDemo_TestLog_h
#include <string>
using namespace std;

class TestLog
{
private:
    string logString;
public:
    void Log(string logMessage);
};


#endif

TestLog.mm

#include "TestLog.h"

void TestLog::Log(string logMessage)
{
    //this->logString->append(logMessage);

}

我错过了什么?我需要将std c++库添加到我的目标S中吗?这与搜索标题路径有关吗?

我只需要使用string类型。

非常感谢您的帮助。


看起来它应该可以工作...但是,你为什么不使用NSString呢? - inspector-g
看起来 XCode 默认不包括 std 路径,我想你需要手动添加。同时避免在 .h 文件中使用 using,最好在实现文件中使用,或者干脆不用它。 - AlexTheo
看一下这里,可能会对你有所帮助: http://www.iphonedevsdk.com/forum/iphone-sdk-development/16528-how-include-stl-xcode.html - AlexTheo
6个回答

9

选择项目 -> 构建设置 -> 苹果LLVM编译器5.1 -> 语言

编译源代码方式中更改为Objective-C++


小改动:选择目标 -> 构建设置。搜索“编译源代码”,更改为 Objective-C++。(现在在 Apple Clang - Language 下)。 - bauerMusic

3
在XCode中有一个小问题。我在7.3版本中注意到了这个问题。大多数项目都能识别.mm文件和STL,但我遇到的一个项目却不能。解决方法是点击左上角的项目图标,然后点击Targets > Build Phases > Link Binary with Libraries > 添加AppKit.framework。接下来,我需要点击Targets > Build Settings > 搜索“Compile Sources”,并将所有可能的列设置为“Objective C++”。然后,从产品菜单中执行“Clean”和“Build”。这样就可以正确编译了。然后,再次回到Compile Sources,将所有可能的列设置回“按文件类型”,然后再次从产品菜单中点击“Build”。此时,它能够正确编译,并允许我使用更好的“按文件类型”的选项。
哦,如果进行Cocoa开发,请不要忘记在您的文件中添加以下头文件:
#import <Cocoa/Cocoa.h>

如果你在进行命令行操作,请不要忘记添加以下内容,而不是使用Cocoa头文件:

#import <Foundation/Foundation.h>

太好了!谢谢!我以为我要疯了...我把我的Xcode从7升级到8,突然间我的C++代码就无法识别了...谢谢! - user2052717

1
我认为您需要包含整个库的路径。类似于“Foundation”和“UIView”框架。
#import <Foundation/Foundation.h>

或者

#import <UIKit/UIKit.h>

是的,请确保将该库添加到您的目标中。


1
我遇到了Cocoapods库Bypass的问题,但这些解决方案都没有起作用。问题出在Cocoapods创建的一个文件上,称为伞头文件。它位于<POD_NAME>/Support Files/<POD_NAME>-umbrella.h中。删除它,就可以正常构建了。
现在来解释一下为什么需要这样做:伞头文件将C++和Objective-C代码混合在一个头文件中,这是一个大忌,最终会完全破坏C++导入。通过删除它(似乎没有影响?),Cocoapods无意中创建的这个冲突导入将消失。

1
在使用 Xcode 12.4 进行 Objective-C 项目开发时,我遇到了需要一个 C++ 模块的问题。解决方法是将 .h 文件的内容进行包装,具体做法如下:
#if defined __cplusplus
  declarations
#endif

显然,Xcode不能很好地检测源代码的混合。

请参见Xcode中出现“顶层声明符号后应有分号”错误


0

这种情况通常发生在Xcode不理解你导入到Objective-C中的C++头文件实际上是用于C++代码的情况下。

因此,您可以通过找到导入C++代码的Objective-C文件,并将其扩展名从.m更改为.mm来解决此问题。


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