【问题标题】:XCode thinks C++ files are C when building for iOS?XCode 在为 iOS 构建时认为 C++ 文件是 C?
【发布时间】:2014-07-16 02:28:16
【问题描述】:

我正在使用 XCode 5.1.1 开发一个 C++ 项目。该项目在 OSX 上编译得很好,但是当我为 iOS 构建时,我遇到了一个问题。编译器产生的错误表明它认为某些文件是 C 语言而不是 C++ 语言。有问题的文件似乎都是只有头文件,没有相应的 cpp 文件。

作为背景,该项目基于 Cocos2d-x 3.0,并在几周前为 iOS 编译。从那以后我添加了jl_signals,它利用了FastDelegate,我知道它做了一些我无法理解的非标准事情。

这些是我遇到的一些错误:

namespace fastdelegate {

...产生错误:

[...]/jlsignal/FastDelegate.h:142:1: Unknown type name 'namespace'
[...]/jlsignal/FastDelegate.h:142:23: Expected ';' after top level declarator

另外,寻找标准库的问题:

#include <new>

...产生错误

[...]]/jlsignal/ScopedAllocator.h:7:10: 'new' file not found    

This 堆栈溢出问题表明编译器正在尝试将项目构建为 c 而不是 c++,这似乎符合症状,但它仅与这个特定的库隔离似乎很奇怪。

我想知道我忽略的某个地方是否有一些构建阶段或 XCode 特定的复选框。谢谢。

任何建议将不胜感激。

编辑:有人建议我将文件从 .m 重命名为 .mm,但该文件是 .h 头文件,因此我无法遵循此建议。项目中的所有其他 C++ 文件都是 .cpp 文件,在我添加这个库之前,该项目肯定已经成功编译为 C++。

编辑 2:好的,我已经成功了。事实证明,关于 .m 与 .mm 的建议毕竟是正确的。这一切都归结为这样一个事实,在 Cocos2d-x 中,ios 构建与 mac 构建有一个单独的主文件,称为 main.m。我将其更改为 main.mm,一切都很好。整个项目都是用 c++ 编写的,所以编译器以某种方式解决了这个问题,但这里出了点问题。

【问题讨论】:

  • 将 .m 文件重命名为 .mm
  • 在文件列表中选择文件,打开文件属性面板。那里有一个部分,您可以在其中指定文件的类型。
  • @HotLicks - 嗨。我尝试将类型设置为“C++ Header”,但没有任何效果。此外,该项目中已经有许多已编译为 c++ 的仅标头文件,即使它们的“类型”设置为默认的“C 标头”
  • 我敢打赌,问题在于您将该 .h 文件导入到 C++ .mm 或 .cpp 文件之外的其他文件中。如果这样做,则需要添加 #if 条件逻辑以跳过仅限 C++ 的语句。
  • 谢谢。你让我找对地方了。

标签: c++ ios xcode compilation


【解决方案1】:

Xcode 为任何名为 filename.mm 的文件激活 c++ 编译器。我猜你的文件名为filename.m

【讨论】:

  • 它实际上被称为 FastDelegate.h,并且只有标题(所以没有 .m 或 .mm)所有其他文件都是 .cpp,并且该项目是 C++ 项目。
猜你喜欢
  • 1970-01-01
  • 2022-07-02
  • 1970-01-01
  • 1970-01-01
  • 2021-05-27
  • 1970-01-01
  • 2014-05-10
  • 2021-05-01
  • 1970-01-01
相关资源
最近更新 更多