OC源码编译

2021-08-27  本文已影响0人  苍眸之宝宝

简介:

  源码编译是学习高级语言底层的最直接的方法,你可以打断点进行各种花样玩法。该篇文章是记录自己编译源码遇到的问题和解决方法。

环境:

  源码版本:objc4-818
  MacOS版本:11.5
  Xcode版本:12.5
  源码文件浏览链接:https://opensource.apple.com/source/
  源码文件下载链接:https://opensource.apple.com/tarballs/

需要源码库:

编译和解决问题过程:

1.Showing Recent Messages unable to find sdk 'macosx.internal'

  打开objc4-818.2的工程文件比编译,报错:


2.png
  解决方法:Target -> objc/objc-trampolines -> Build Setting -> Base SDK -> macOS,如下图: 3.png
  注意:objc和objc-trampolines都要选中macOS。
2. 'sys/reason.h' file not found

  选中Target objc编译,报错:


4.png

  解决方法:

  1. 在工程中添加放置文件的文件夹:
      注意:Compile文件夹名称随意取,sys文件固定。

  2. 添加reason.h文件:
      获取步骤:xnu-7195.141.2 -> bsd -> sys -> reason.h;
      获取后添加到上一步的sys文件夹下。

  3. 修改工程中文件检索路径:
      修改步骤:Build Settings -> Header Search Paths -> $(SRCROOT)/Compile


    5.png
3.'mach-o/dyld_priv.h' file not found

  解决方法与2中相同,在Compile添加mach-o文件夹,按照dyld-852.2 -> include -> mach-o -> dyld_priv.h找到dyld_priv.h文件,添加到mach-o文件夹中。
  编译后dyld_priv.h中会报错,将报错的代码全部注释或者将bridgeos(3.0)去掉。


6.png
4.'os/lock_private.h' file not found

  解决方法与2中相同,在Compile添加os文件夹,按照libplatform-254.80.2 -> private -> os -> lock_private.h找到lock_private.h文件,添加到os文件夹中。


7.png
5.'os/base_private.h' file not found

  解决方法与2中相同,按照xnu-7195.141.2 -> libkern -> os -> base_private.h找到base_private.h文件,添加到os文件夹中。
  添加文件后编译报错,同3中将代码注释或者将bridgeos(4.0)去掉,这里将bridgeos(4.0)去掉。


8.png
6.'pthread/tsd_private.h' file not found

  解决方法与2中相同,在Compile添加pthread文件夹,按照libpthread-454.80.2 -> private -> pthread -> tsd_private.h找到tsd_private.h文件,添加到pthread文件夹中。


9.png
7.'System/machine/cpu_capabilities.h' file not found

  解决方法与2中相同,在Compile添加System文件夹,在System文件夹添加machine文件夹,按照xnu-7195.141.2 -> osfmk -> machine -> cpu_capabilities.h找到cpu_capabilities.h文件,添加到machine文件夹中。


10.png
8.'os/tsd.h' file not found

  解决方法与2中相同,按照xnu-7195.141.2 -> libsyscall -> os -> tsd.h找到tsd.h文件,添加到os文件夹中。

9.'pthread/spinlock_private.h' file not found

  按照libpthread-454.80.2 -> private -> pthread -> spinlock_private.h找到spinlock_private.h文件,添加到pthread文件夹中。


11.png
10.'System/pthread_machdep.h' file not found/'CrashReporterClient.h' file not found

  将这两个文件的引入注释掉即可。


12.png
11.'Block_private.h' file not found

  按照libclosure-79 -> Block_private.h找到Block_private.h文件,添加到Compile文件夹中。

12.'Cambria/Traps.h' file not found/'Cambria/Cambria.h' file not found/'os/feature_private.h' file not found

  将这两个文件的引入注释掉即可。

13.'_simple.h' file not found

  按照libplatform-254.80.2 -> private -> _simple.h找到_simple.h文件,添加到Compile文件夹中。

14.'objc-shared-cache.h' file not found

  按照dyld-852.2 -> include -> objc-shared-cache.h找到objc-shared-cache.h文件,添加到Compile文件夹中。

15.'os/linker_set.h' file not found

  按照Libc-1439.40.11 -> os -> linker_set.h找到linker_set.h文件,添加到os文件夹中。

16.'kern/restartable.h' file not found

  在Compile文件夹下添加kern文件夹;按照xnu-7195.141.2 -> osfmk -> kern -> restartable.h找到restartable.h文件,添加到kern文件夹中。

17.'objc-bp-assist.h' file not found

  注释该引入文件代码。

18.'os/reason_private.h' file not found/'os/variant_private.h' file not found

  按照xnu-7195.141.2 -> libkern -> os -> reason_private.h找到reason_private.h文件,添加到os文件夹中;按照Libc-1439.40.11 -> os -> variant_private.h找到variant_private.h文件,添加到os文件夹中。

19.因为注释文件导致的编译错误:

  如CRGetCrashLogMessage、dyld_fall_2020_os_versions、dyld_platform_version_macOS_10_13、STATIC_ASSERT错误等,将错误代码注释即可;将sdkIsAtLeast(10_12, 10_0, 10_0, 3_0, 2_0)、bridgeos(4.0)、bridgeos代码去除。
  将各种file not found错误和相关错误干掉后,文件目录如下图:


16.png
20.can't open order file: /.../OrderFiles/libobjc.order

  libobjc.order加载路径问题,将绝对路径改为相对路径;Target -> Build Settings -> Order File -> 双击添加$(SRCROOT)/libobjc.order。


13.png
21.Showing Recent Messages Library not found for -lCrashReporterClient

  Target -> Build Settings -> Other Linker Flags -> 删除-lCrashReporterClient和-loah即可。


14.png
22. SDK "macosx.internal" cannot be located.

  Target -> objc -> Build Phases -> Run Script(markgc)把脚本文本macosx.internal 改成 macosx


15.png

  编译成功,此处应该有掌声~啪啪啪,不要高兴的太早,这还是个中场啊。

开启多灾多难的源码编译调试旅程:

1.工程内部添加一个Target

  工程内部添加一个Target;按照File -> New -> Target -> macOS -> Application -> Command Line Tool添加Target,编辑一些Target必要信息,点击next,完成Target创建。


17.png 18.png
2.绑定依赖库

  Target -> 创建的Target -> Build Phases -> Dependencies/Link Binary With Libraries添加依赖和链接的库。


19.png
2.添加类和调试代码

  选中创建的Target文件夹下,添加类和代码,在main文件中引入调用,断点打上,激动人心的时刻来临了,run运行下,我去,不走断点,什么鬼?

20.png
  解决方法:Xcode调试断点无效中的第3条.
21.png
  main中的断点是可以调试,但是runtime源码中的断点还是调试不了?
  解决方法:Target -> Build Settings -> Enable Hardended Runtime -> 设置为NO。
22.png
  终于搞定了,多灾多难的过程啊,这还只源码调试的开始而已啊!
23.png
上一篇 下一篇

猜你喜欢

热点阅读