clang编译objective-c失败

浏览:42日期:2023-11-22

问题描述

#import <Foundation/Foundation.h>extern void _objc_autoreleasePoolPrint();int main(int argc, char * argv[]) { @autoreleasepool {Person *p = [Person new];Person __weak *p2 = p;_objc_autoreleasePoolPrint(); }}

结果是这样的:

$ clang -rewrite-objc -fobjc-arc main.m/var/folders/t0/nty3j9vx1rn8786q_tpclydc0000gn/T/main-2fe2fd.mi:46509:31: error: cannot create __weak reference because the current deployment target does not support weak referencesPerson __attribute__((objc_ownership(weak))) *p2 = p; ^1 error generated.

求解答

问题解答

回答1:

__Weak不是应该在类名前面吗?

回答2:

weak 需要运行时环境的支持。

xcrun --show-sdk-path > SDK_PATH;clang -x objective-c -isysroot $SDK_PATH -rewrite-objc -fobjc-arc -fblocks -mios-version-min=8.0.0 -fobjc-runtime=ios-8.0.0 -O0 main.m

当你选择了一个合适的最低版本后,才能编译有 weak 修饰变量的源码。

回答3:

参数rewrite-objc是把objc代码“导出”为c++代码,而__weak是在objc ARC编译时修改的,你是要编译还是转换?转换的话把 __weak 改为 __unsafe_unretained 。编译的话去掉 rewrite-objc 参数。

$ clang -fobjc-arc main.m -o main.o$ ./main.o

objc[91465]: ##############objc[91465]: AUTORELEASE POOLS for thread 0x7fff7c93f000objc[91465]: 1 releases pending.objc[91465]: [0x7f8471000000] ................ PAGE (hot) (cold)objc[91465]: [0x7f8471000038] ################ POOL 0x7f8471000038objc[91465]: ##############

相关文章: