【问题标题】:__has_feature(objc_arc) does not work for c++ static library linked to iOS app__has_feature(objc_arc) 不适用于链接到 iOS 应用程序的 c++ 静态库
【发布时间】:2013-06-07 11:42:39
【问题描述】:

所以我有一个简单的 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。

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

【问题讨论】:

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


    【解决方案1】:

    预计会发生这种情况,因为编译 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++ 无论如何都会有兴趣查看此标头,这对我来说并不是很明显。也许您可以扩展它以正确解决此问题?

    【讨论】:

    • 是的。你是对的。我不认为clang在编译C++时会忽略这些选项。将文件扩展名从 .cc 更改为 .mm 后,问题就消失了。关于标题的可见性:你又是对的。现在又带来了一个关于 C++ 库的问题,它似乎是为 iOS 准备的 Objective-C++。
    • @user1264176 如果您希望此库保持跨平台,则将源文件重命名为 .mm 会导致问题。如果你想要一个回调机制,这是我个人使用过的唯一C++调用Objective-C/C++用例,那么一个简单的类似C的回调机制是可能的,这允许从 C++ 和 Objective-C++ 使用该库。
    • 是的,我明白了。我写了关于文件重命名的文章只是为了确认你的答案。看来我需要重新考虑我对这个应用程序和库的处理方法。谢谢你的帮助。
    猜你喜欢
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    • 2012-05-02
    • 1970-01-01
    • 2011-01-06
    • 2016-01-24
    • 1970-01-01
    • 2013-08-26
    相关资源
    最近更新 更多