和谐学习!不急不躁!!我是你们的老朋友小青龙~
前言
今天分享一篇关于官方objc源码工程编译错误的解决方案。
说来惭愧,之前的很多发文一直都是用的Cooci老师弄好的源码库,作为一个爱学习的程序员(呸,臭不要脸),应当学会自己开车(是去幼儿园的那种),自己解决问题。
【环境说明】
Mac电脑系统:macOS Big Sur 11.5.2
Xcode版本:13.2.1
官方objc源码下载:
opensource.apple.com/tarballs/ob…
我下载的是818.2版本
下载完并解压
打开objc4-818.2工程,我们发现了几个缺失文件:
先不管它们,直接运行。
1、unable to find sdk 'macosx.internal'
【解决方案】 Build Settings->搜Base SDK
Targets修改
Project修改
如果改完发现还是报这个错误,记得clean一下再运行。
2、'sys/reason.h' file not found
运行发现再次报错,原因是缺失reason.h这个文件。
【解决方案】
打开网站:opensource.apple.com/source/xnu/
复制最新版本名(我这里是xnu-7195.81.3)
下载地址:opensource.apple.com/tarballs/xn…
(可以参考格式,修改要下的版本号)
下载完会得到一个文件:xnu-7195.81.3.tar。
解压,找到reason.h (xnu-7195.81.3 -> bsd -> sys -> reason.h)
在项目根目录创建文件结构lostFiles -> sys -> reason.h
Targets -> Build Setting -> Header Search Paths->添加$(SRCROOT)/lostFiles
3、'mach-o/dyld_priv.h' file not found
运行继续报错
【解决方案】 打开:
opensource.apple.com/tarballs/dy…
解压找到文件dyld_priv.h
lostFiles下创建一个文件夹mach-o,并拖动dyld_priv.h到文件夹mach-o
4、dyld_priv.h文件报错Expected ','
【解决方案】把这行代码注释了就行。
5、'os/lock_private.h' file not found
打开网站:opensource.apple.com/tarballs/li…
解压找到文件:
libplatform-177.270.1/private/os/lock_private.h
根目录文件增加
6、'os/base_private.h' file not found
找到文件:
libplatform-177.270.1/private/os/base_private.h
根目录文件增加
7、'pthread/tsd_private.h' file not found
打开网站:opensource.apple.com/tarballs/li…
找到文件:
libpthread-416.100.3/private/tsd_private.h
根目录文件增加
8、'System/machine/cpu_capabilities.h' file not found
打开网站(前面已经下载过了):
opensource.apple.com/tarballs/xn…
找到文件:
xnu-7195.81.3/osfmk/machine/cpu_capabilities.h
根目录文件增加
9、'os/tsd.h' file not found
找到文件:xnu-7195.81.3/libsyscall/os/tsd.h
根目录文件增加
10、'pthread/spinlock_private.h' file not found
(libpthread-416.100.3库前面已经下载过了)
找到文件:
libpthread-416.100.3/private/spinlock_private.h
根目录文件增加
11、'System/pthread_machdep.h' file not found
打开网站:opensource.apple.com/tarballs/Li…
找到文件:
Libc-825.40.1/pthreads/pthread_machdep.h
根目录文件增加
12、'CrashReporterClient.h' file not found
找到文件:
Libc-825.40.1/include/CrashReporterClient.h
根目录文件增加
13、Typedef redefinition with different types ('int' vs 'volatile OSSpinLock' (aka 'volatile int'))
字面意思是 使用不同类型重新定义了pthread_lock_t
全局搜索pthread_lock_t
我们发现在spinlock_private.h和pthread_machdep.h,都对pthread_lock_t进行了定义。
【解决方案】 注释pthread_machdep.h里的pthread_lock_t定义这行代码。
14、多个declaration错误
代码语言:javascript复制// 错误信息如下
Static declaration of '_pthread_has_direct_tsd' follows non-static declaration
Static declaration of '_pthread_getspecific_direct' follows non-static declaration
Static declaration of '_pthread_setspecific_direct' follows non-static declaration
(滑动显示更多)
【解决方案】把这三个函数连带实现内容都注释掉
15、Use of undeclared identifier 'OS_UNFAIR_LOCK_ADAPTIVE_SPIN'
【解决方案】
代码语言:javascript复制// uint32_t opts = OS_UNFAIR_LOCK_DATA_SYNCHRONIZATION | OS_UNFAIR_LOCK_ADAPTIVE_SPIN;
// 修改为
uint32_t opts = OS_UNFAIR_LOCK_DATA_SYNCHRONIZATION;
os_unfair_lock_lock(&mLock);
(滑动显示更多)
16、'objc-shared-cache.h' file not found
找到文件:dyld-852.2/include/objc-shared-cache.h
根目录文件增加
17、'objc-probes.h' file not found
18、'os/feature_private.h' file not found
【解决方案】 将#include <os/feature_private.h>这行注释掉
19、找不到未申明的'dyld_fall_2020_os_versions'、'objc4'、'preoptimizedCaches'
代码语言:javascript复制// 报错信息
Use of undeclared identifier 'dyld_fall_2020_os_versions'
Use of undeclared identifier 'objc4'
Use of undeclared identifier 'preoptimizedCaches'
(滑动显示更多)
【解决方案】
20、'objc-bp-assist.h' file not found
【解决方案】 注释这行引用代码
21、Use of undeclared identifier 'dyld_platform_version_macOS_10_13'
【解决方案】
22、Use of undeclared identifier 'dyld_platform_version_macOS_10_11'
【解决方案】
23、Use of undeclared identifier 'dyld_fall_2018_os_versions'
【解决方案】
24、'_simple.h' file not found
找到文件:
libplatform-177.270.1/private/_simple.h
根目录文件增加
25、'Block_private.h' file not found
打开网站:opensource.apple.com/tarballs/li…
解压并找到文件:libclosure-79/Block_private.h
根目录文件增加
26、'os/linker_set.h' file not found
找到文件:Libc-1439.40.11/os/linker_set.h
根目录文件增加
27、Use of undeclared identifier 'CRGetCrashLogMessage'
【解决方案】
Build Settings -> 搜索Preprocessor Macros, 添加
LIBC_NO_LIBCRASHREPORTERCLIENT
添加完再编译,就不报这个错了
28、'Cambria/Traps.h' file not found
【解决方案】为了避免提示'Cambria/Cambria.h' file not found,干脆两行都注释了
29、'kern/restartable.h' file not found
找到文件:
xnu-6153.81.5/osfmk/kern/restartable.h
根目录文件增加
30、Use of undeclared identifier 'oah_is_current_process_translated'
修改前
修改后
31、'os/feature_private.h' file not found
【解决方案】 注释这行代码
32、'os/reason_private.h' file not found | 'os/variant_private.h' file not found
代码语言:javascript复制// 报错信息
'os/reason_private.h' file not found
'os/variant_private.h' file not found
(滑动显示更多)
【解决方案】
33、Use of undeclared identifier 'dyld_platform_version_xx_x_x'
代码语言:javascript复制// 报错信息
Use of undeclared identifier 'dyld_platform_version_bridgeOS_2_0'
Use of undeclared identifier 'dyld_platform_version_iOS_10_0'
Use of undeclared identifier 'dyld_platform_version_macOS_10_12'
Use of undeclared identifier 'dyld_platform_version_tvOS_10_0'
Use of undeclared identifier 'dyld_platform_version_watchOS_3_0'
(滑动显示更多)
【解决方案】 注释选中代码
34、Can't open order file: /Applications/Xcode.app/Contents…OrderFiles/libobjc.order
代码语言:javascript复制// 报错信息
Can't open order file: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.1.sdk/AppleInternal/OrderFiles/libobjc.order
(滑动显示更多)
【解决方案】 Build Settings->搜orderfile->添加$(SRCROOT)/libobjc.order
35、library not found for -lCrashReporterClient
【解决方案】 Build Settings->搜other link->删除-lCrashReporterClient
36、library not found for -loah
【解决方案】跟35一样,Build Settings->搜other link->删除-loah
37、'_static_assert' declared as an array with a negative size
【解决方案】
38、SDK "macosx.internal" cannot be located.
【解决方案】TARGETS->Build Phases->Run Script(markgc)->修改macosx.internal为macosx
39、Expected function body after function declarator
很多地方报了一样的错误提示Expected function body after function declarator
终于编译成功了
经过一系列问题的修复,终于看到了久违了Build Successded
新建一个调试
【点击 号】
【选择macOS - Command Line Tool】
【输入名称】
【关联依赖】
【运行ing】
报错在这一行
代码语言:javascript复制lock.lock();
错误信息提示是
代码语言:javascript复制Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
(滑动显示更多)
错误提示看不到什么有用的提示,但是我们知道肯定是lock方法出了问题。
【解决方案】注释lock方法里的os_unfair_lock_lock(&mLock);这行代码
【再次运行】
成功打印NSLog日志。
参考文章链接
lock方法错误解决
感谢这位小伙伴提供的Demo,我用demo里面的objc-os.h文件和我自己工程的objc-os.h文件对比了下,发现lock方法不太一样,最终才意识到是多了一行代码。
objc4源码编译与调试
www.jianshu.com/p/bffba0169…
编译错误解决
参考文章:
iOS-objc4-781源码编译配置流程
www.jianshu.com/p/4f15c551a…
objc源码编译
www.jianshu.com/p/5fc26fed9…
由于是在Xcode13.2.1版本上编译的,所以在配置一些缺失的库文件上,我尽可能的选择最新的。
附一张lostFiles文件夹结构图
编译好的源码
链接: pan.baidu.com/s/1xt2YuoZm…
提取码: ov85 --来自百度网盘超级会员v3的分享
来源:稀土掘金
作者:小青龙716
链接:https://juejin.cn/post/7049995719112917029
- END -