【问题标题】:Build Objective-C Library with CMake with ARC enabled使用启用 ARC 的 CMake 构建 Objective-C 库
【发布时间】:2015-02-22 19:32:33
【问题描述】:

我正在尝试使用 CMake 构建启用了 Objective-C ARC 的库。使用“Unix Makefiles”生成器时,我遇到了警告:

方法可能缺少 [super dealloc] 调用

我在使用 XCode 生成器时没有遇到此警告。是否有一个标志我可以传递给 CMake 以确保命令行构建也将其识别为 ARC 构建并且没有生成该警告?

谢谢

【问题讨论】:

    标签: objective-c cmake


    【解决方案1】:

    您需要让 CMake 知道您想使用 ARC 构建项目。否则,它将显示警告。

    选项 1

    但是,CTSetObjCArcEnabled 只有在我们安装了 cmake-toolkit 时才可用。如果没有安装,可以使用如下:

    set_property (TARGET target_name APPEND_STRING PROPERTY 
                  COMPILE_FLAGS "-fobjc-arc")
    

    选项 2(自 3.0 起已弃用)

    使用CTSetObjCARCEnabled。可参考here:

    在每个目录、每个目标或每个源的基础上启用或禁用 Objective-C 自动引用计数。

    CTSetObjCARCEnabled(<value>  
            <DIRECTORY | TARGETS targets... | SOURCES sources... >)
    

    实用提示

    此外,正如 answer 所建议的,使用以下方法来确保在启用 ARC 的情况下编译项目是有帮助的:

    #if ! __has_feature(objc_arc)
    #error "ARC is off"
    #endif
    

    【讨论】:

    • 谢谢。 CTSetObjCArcEnabled 仅在我们安装了 cmake-toolkit 时可用。不过顺着cmake-toolkit的源码,我找到了相关的代码——set_property(TARGET target_name APPEND_STRING PROPERTY COMPILE_FLAGS "-fobjc-arc")
    • @georgemp,感谢分享知识!我也相应地更新了我的答案。
    • 不再维护:“老警告:这个 repo 不再维护,并且可以追溯到几年前我第一次学习 CMake 时;现代(3.0 后)”(github.com/nickhutchinson/cmake-toolkit)第二个选项可能成为第一个
    【解决方案2】:

    另一种方法是指定每个目标的编译器标志。这可以被认为更符合现代 CMake:

    target_compile_options(target_name PUBLIC "-fobjc-arc")
    


    注意:使用PUBLIC 会将此编译器标志传递到其他目标,具体取决于该目标。替换为PRIVATE 将阻止这种传播。

    【讨论】:

      【解决方案3】:

      XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_ARC 适合我。见https://github.com/forexample/testapp/blob/master/CMakeLists.txt

      set_target_properties(
          ${APP_NAME}
          PROPERTIES
          MACOSX_BUNDLE YES
          XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_ARC YES  
      )
      

      【讨论】:

      • 这仅在您生成 Xcode 项目并使用 Xcode 构建它时才有效。如果您使用其他生成器,例如 Makefiles 或 Ninja,此属性将不起作用。
      • 如果您正在使用此方法并且只希望在没有自动引用计数的情况下编译特定文件,请使用 -fno-objc-arc 编译器标志:set_property(SOURCE file.cpp APPEND_STRING PROPERTY COMPILE_FLAGS "-fno-objc-arc")
      猜你喜欢
      • 1970-01-01
      • 2013-11-22
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 2022-01-07
      相关资源
      最近更新 更多