1

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

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

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

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

当我编译项目时,它是在未启用 ARC 的情况下编译的。所以“// something else ...”是在代码中设置的,而不是“@autoreleasepool”。

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

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

在此处输入图像描述

有没有人有任何建议为什么会发生这种情况?

4

1 回答 1

0

希望它会发生,因为在编译 C++ 时 clang 会忽略该选项。您需要避免 C++@autoreleasepool使用警卫完全看到该声明(无论如何在 C++ 中是非法的):

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

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

鉴于它无法使用 Objective-C 对象(只有 Objective-C++ 可以),为什么普通 C++ 无论如何都会有兴趣查看此标头,这对我来说并不是很明显。也许您可以扩展它以正确解决此问题?

于 2013-06-07T11:47:00.480 回答