【发布时间】: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