在Objective-C ++代码中编译C ++代码中的C代码

时间:2012-07-03 22:05:19

标签: objective-c ios xcode objective-c++ llvm-3.0

我的问题有点复杂:

库: 我有一个用C和C ++编写的库。它使用Apple LLVM在XCode中完美编译。 这个库本身的工作是由C代码完成的,而C ++部分只是一个C ++接口,因为我更喜欢C ++。从理论上讲,我只需要使用C ++来与它进行交流。

应用程序: 我在Objective-C中有一个使用上面的库的应用程序。当然,由于与我的库的通信是通过C ++完成的,我需要一个.mm文件才能从“Objective-C ++”调用我的库。

在编译期间......发布了几个“C”语言:

  • 错误:非const静态数据成员必须在行外初始化
  • 错误:文件范围不允许使用语句表达式
  • 等...

只有Objective-C ++

才会发生
  • Objective-C ++(app) - > C ++标头(lib) - > C头(lib,带有extern“C”) - > 不行! WHY吗

如果我为库的测试制作另一个C ++应用程序,那就没关系

  • C ++(app) - > C ++(lib) - > C头(lib,带有extern“C”) - >的确定

详细信息:我一直在使用Apple LLVM编译器

问题: 如何从Objective-C ++代码编译C ++中的C代码?为什么它与从常规C ++代码编译不同?

2 个答案:

答案 0 :(得分:2)

别忘了做

#ifdef __cplusplus
extern "C" {
#endif

<Some C method declaration>

#ifdef __cplusplus
}
#endif

在包含C方法声明的头文件中。

答案 1 :(得分:0)

经过长时间的尝试和Google,我终于明白了。 在我调用C头之前,我应该取消定义MAX和MIN宏。由于某种原因,他们之前已定义。编译器不会精确显示错误。这就是为什么这很困难。我正在使用的C框架有它自己的MAX和MIN宏的声明......

另一个可能对其他人有用的非常有趣的事情是,在我们需要做同样的事情之前:如果我们使用一些C框架实现它自己的max和min,则取消定义max和min(小写)。

它解决了这两个问题。