【问题标题】:How to #import C++ Header File in iPhone/iPad Objective C Project如何在 iPhone/iPad 目标 C 项目中 #import C++ 头文件
【发布时间】:2013-01-31 09:36:31
【问题描述】:

参考问题:Problem when #import C++ Header File in iPhone/iPad Project

嗯,我的项目比较大,无法解决这个问题,要么将 ALL 或 PART OF 我的项目文件 .m 更改为 .mm,要么更改 ALL 或 PART OF File Inspector 中的文件类型。

那是因为我的同事和库作者都严格遵循 C++ 标准,例如将 void* 分配给 int* 以及其他各种违规行为。 Objective C 将允许这些并且只是给出警告。

我要#import 的C++ 头文件是一个库。它在其标头中使用关键字 namespace,而其实现位于 .a 程序集文件中。这意味着几乎不可能破解它们。除此之外,我的项目还包括其他仅与 Objective C 兼容的库。

有人知道怎么解决吗?

我能想到的方式如下:

  1. namespace 寻找替代方案,但我仍然想写 在我的项目中使用QCAR::Renderer 之类的代码。

  2. 告诉编译器识别 C++ 头文件(嗯,那可能不是 可能)

编辑

#ifdef __cplusplus
# include MyCPPHeader.h
#endif

如果我使用它,MyCPPHeader.h 真的会被包含在 Objective-C 环境中吗?我猜不会。这违反了不入侵图书馆的原则。

编辑

即使我更改了这些 .mm 文件以包含该 C++ 标头,我也会收到一个链接错误,提示 Undefined symbols for architecture armv7:。当我的 .mm 文件包括其他 库中的.h 标头时会发生这种情况。

【问题讨论】:

  • 将源文件命名为 .mm 应该可以正常工作(我正在开发的 Mac 应用程序使用大型 C++ 库,并且我的大多数应用程序实现文件使用 .mm 文件扩展名)。也许您错误地将 C++ 标头包含在 .m 文件中(直接或间接)?
  • 您的问题是如何表现出来的?作为编译器错误,如果是,哪个?作为链接器错误,如果是,哪个?作为运行时错误,如果是,是哪个?
  • 因为我不是那些 .m 文件的作者。如果我把.m后缀改成.mm,我会修改他们的代码。
  • 你写的是c++库还是包含c++库的项目?您必须能够更改至少一个部分才能获得帮助。
  • @ComboZhc 就像你的问题毕竟不是 c++ 一样。看起来 lib 没有用 armv7 编译。

标签: c++ iphone objective-c xcode objective-c++


【解决方案1】:

我在一年前解决了这个问题,但是对于正在寻找答案的其他人来说,这里是解决方案。

假设 C++ 样式的标头名为 cpp.h。在我的项目中,我从来没有#import "cpp.h"。我编写了一个名为c.h 的C 风格头文件作为cpp.h 的包装头文件。然后我写了一个C++实现源文件,命名为c.mm,通过调用cpp.h中的函数来实现c.h中定义的函数。如果我想调用cpp.h 中的函数,我#import c.h 并改用包装函数。

下面的解释可能更清楚:

cpp.h使用namespace的C++风格头文件,它的实现是汇编代码所以很难改变

c.h C 样式标头作为 cpp.h 的包装器

c.mm C++实现通过调用cpp.h中的函数实现c.h中的函数

#import "c.h" 使用包装函数

【讨论】:

    猜你喜欢
    • 2011-03-17
    • 2023-03-17
    • 1970-01-01
    • 2016-11-20
    • 1970-01-01
    • 2014-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多