【发布时间】:2015-02-22 19:32:33
【问题描述】:
我正在尝试使用 CMake 构建启用了 Objective-C ARC 的库。使用“Unix Makefiles”生成器时,我遇到了警告:
方法可能缺少 [super dealloc] 调用
我在使用 XCode 生成器时没有遇到此警告。是否有一个标志我可以传递给 CMake 以确保命令行构建也将其识别为 ARC 构建并且没有生成该警告?
谢谢
【问题讨论】:
标签: objective-c cmake
我正在尝试使用 CMake 构建启用了 Objective-C ARC 的库。使用“Unix Makefiles”生成器时,我遇到了警告:
方法可能缺少 [super dealloc] 调用
我在使用 XCode 生成器时没有遇到此警告。是否有一个标志我可以传递给 CMake 以确保命令行构建也将其识别为 ARC 构建并且没有生成该警告?
谢谢
【问题讨论】:
标签: objective-c cmake
您需要让 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
【讨论】:
另一种方法是指定每个目标的编译器标志。这可以被认为更符合现代 CMake:
target_compile_options(target_name PUBLIC "-fobjc-arc")
注意:使用PUBLIC 会将此编译器标志传递到其他目标,具体取决于该目标。替换为PRIVATE 将阻止这种传播。
【讨论】:
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
)
【讨论】:
-fno-objc-arc 编译器标志:set_property(SOURCE file.cpp APPEND_STRING PROPERTY COMPILE_FLAGS "-fno-objc-arc")