导语
objc 运行时的最新版本为 709 ,一回生,二回熟,简单的记录一下过程。
环境 & 工具
macOS Sierra 10.12.4
Xcode 8.3.2
objc-709
搭建 objc-706 时的头文件
流程
✘ 'sys/reason.h’ file not found (objc-os.h)
因为打算把缺少的头文件统一放到工程下的 include 目录下,因此在 Building Setting > Header Search Paths 添加 $(SRCROOT)/include
字段
1 | ➜ cd /path/to/objc4-709 |
递归创建目录,将 reason.h 拷贝到 sys 目录中
✘ mach-o/dyld_priv.h file not found (objc-os.h)
同理,创建 mach-o
目录 & 拷贝 dyld_priv.h
到 mach-o
中
✘ os/lock_private.h file not found (objc-os.h)
创建目录 & 拷贝 lock_private.h
✘ 'System/pthread_machdep.h’ file not found (objc-os.h)
创建目录 & 拷贝 pthread_machdep.h
✘ System/machine/cpu_capabilities.h file not found (pthread_machdep.h)
创建目录 & 拷贝 cpu_capabilities.h
✘ CrashReporterClient.h file not found (objc-os.h)
创建目录 & 拷贝 cpu_capabilities.h
✘ CrashReporterClient.h file not found (CrashReporterClient.h)
根据 objc-706
的经验
在 Build Settings->Preprocessor Macros(Debug & Release) 加入:
LIBC_NO_LIBCRASHREPORTERCLIENT
编译报了很多错,先解决缺少头文件的问题
✘ phread/workqueue_private.h file not found (objc-os.h)
创建目录 & 拷贝 workqueue_private.h
✘ pthread/qos_private.h file not found (objc-os.h)
拷贝 qos_private.h
到 pthread
目录
✘ sys/qos_private.h file not found (objc-os.h)
拷贝 qos_private.h
到 sys
目录
✘ objc-shared-cache.h file not found (objc-os.h)
拷贝 objc-shared-cache.h
到 include
目录,不报缺少头文件的错误了,继续解决变量未定义的问题,用 grep
的方式去找出来
1 | ➜ grep -rne "#define.*_PTHREAD_TSD_SLOT_MACH_THREAD_SELF" . |
✔︎ /libpthread-218.20.1/private/tsd_private.h
workqueue_private.h
也是来自于 /libpthread-218.20.1/private
,已拷贝到 pthread
目录,将 tsd_private.h
也拷贝至pthread目录下
还是报错,检查 objc-os.h
发现并未引入 tsd_private.h
头文件
在第 34 行上下加一句
1 | #include <pthread/tsd_private.h> |
✘ 'os/tsd.h’ file not found (tsd_private.h)
拷贝 tsd.h
到 os
目录
✘ 'pthread/spinlock_private.h’ file not found (tsd_private.h)
拷贝 spinlock_private.h
到 pthread
目录
因为我拷贝的是原来自己已经处理过的文件,所以没有出现重复定义的错误
✘ Unknown type name 'pthread_priority_t’ (objc-os.h)
引入 qos_private.h
头文件,如下所示
1 | #include <pthread/qos_private.h> |
✘ Unknown type name 'os_unfair_lock (objc-os.h)'
同样的问题,已经在 objc-706 中出现过了
解决方法是:
1 | #include "objc-lockdebug.h" |
✘ '_simple.h’ file not found (objc-errors.mm)
拷贝 _simple.h
到 include
目录
✘ 'Block_private.h’ file not found (objc-block-trampolines.mm)
拷贝 Block_private.h
到 include
目录
报 libobjc.order 链接失败
解决办法是将 Building Settings 中的 Order File 的字段 改为 $(PROJECT_DIR)/libobjc.order
因为工程中并没有 CrashReporterClient 的库
将 Other Linker flags 中的 -lCrashReporterClient 参数去掉
编译通过
创建一个 debug-objc 的 target ,导入修改的 libobjc.A.dylib,就又可以愉快的调试了。