__has_feature(objc_arc)不适用于链接到iOS应用程序的c ++静态库

时间:2013-06-07 11:42:40

标签: ios macros automatic-ref-counting static-libraries llvm

所以我有一个简单的iOS项目,必须使用静态库。该库主要以c ++编写,往往是跨平台的。它可以使用Xcode构建。

我创建了一个示例iOS应用程序项目,将库的项目作为子项目添加到它,添加库作为我的iOS应用程序的依赖项。

我的iOS应用使用ARC。在库中我有几个预处理器宏,如

#if __has_feature(objc_arc)
  @autoreleasepool
#elif defined(OSX) || defined(IOS)
  // something else ...

编译项目时,编译,未启用ARC 。所以“//其他东西......”是在代码而不是“@autoreleasepool”中设置的。

我甚至为库目标和使用这些宏的特定文件设置了额外的-fobjc_arc标志。请看截图。

我使用Xcode版本4.6.2(4H1003),编译器是Apple LLVM 4.2。

enter image description here

有没有人有任何建议为什么会这样?

1 个答案:

答案 0 :(得分:0)

期待它发生了,因为clang在编译C ++时会忽略该选项。您需要使用一个警卫来避免C ++完全看到该声明(@autoreleasepool在C ++中是非法的):

#ifdef __OBJC__
#if __has_feature(objc_arc)
  @autoreleasepool
#elif defined(OSX) || defined(IOS)
  // something else ...
#endif
#endif // __OBJC__

在C ++和Objective-C ++之间共享的那些头文件中。

对于我来说,为什么普通的C ++无论如何都会对这个标题感兴趣,因为它无法使用Objective-C对象(只有Objective-C ++才能),这一点并不是很明显。也许你可以扩展它以正确解决这个问题?