- 本文主要是通過將
objc4-781
的源碼編譯成功敛瓷,然后在源碼中新建一個YYTest的Target雹顺,然后將其與objc4-781工程源碼進行綁定野来,最后運行YYTest進行底層源碼的調試截汪;
工具環(huán)境
- Xcode Version 11.3.1
- MacOS 10.15.3 (19D76)
- objc4-781源碼
objc4-781源碼運行所需要的依賴文件
編譯objc4-781源碼工程所遇到的問題及解決方案
問題一: unable to find sdk 'macosx.internal
- 解決方案:選擇
target -> objc -> Build Settings -> Base SDK -> 選擇 macOS
【target中的 objc 和 obc-trampolines都需要更改】
問題二: 'sys/reason.h' file not found
- 解決方案: 在objc4-781的根目錄下新建YYCommon文件夾, 同時在YYCommon文件中創(chuàng)建sys文件夾;
將依賴文件xnu-6153.11.26下的reason.h(路徑為:
xnu-6153.11.26/bsd/sys/reason.h
)拷貝到新建YYCommon/sys文件夾中疾牲;-
設置文件檢索路徑:選擇
target -> objc -> Build Settings
,在工程的 Header Serach Paths 中添加搜索路徑$(SRCROOT)/YYCommon
問題三: mach-o/dyld_priv.h' file not found
- 解決方案:在objc4-781的根目錄下的YYCommon文件夾下新建mach-o文件夾衙解;
- 將依賴文件dyld-733.6下的dyld_priv.h(路徑為:
dyld-733.6/include/mach-o/dyld_priv.h
)拷貝到新建YYCommon/mach-o文件夾中阳柔; - 拷貝到文件后,還需要修改 dyld_priv.h 文件蚓峦,即在 dyld_priv.h文件頂部加入一下宏:
#define DYLD_MACOSX_VERSION_10_11 0x000A0B00
#define DYLD_MACOSX_VERSION_10_12 0x000A0C00
#define DYLD_MACOSX_VERSION_10_13 0x000A0D00
#define DYLD_MACOSX_VERSION_10_14 0x000A0E00
- 修改后的dyld_priv.h文件舌剂;
- 若dyld_priv.h文件出現(xiàn)
bridgeos(3.0)
報錯,則將參數(shù)bridgeos(3.0)去除暑椰,去除之后如下所示霍转;
問題四: os/lock_private.h' file not found
- 解決方案:在objc4-781的根目錄下的YYCommon文件夾下新建os文件夾;
- 將依賴文件libplatform-220下的lock_private.h和base_private.h(路徑為:
libplatform-220/private/os/lock_private.h,base_private.h
)拷貝到新建YYCommon/os文件夾中一汽;
問題五: 'pthread/tsd_private.h' file not found
- 解決方案:在objc4-781的根目錄下的YYCommon文件夾下新建pthread文件夾谴忧;
- 將依賴文件
libpthread-416.11.1
下的tsd_private.h
和spinlock_private.h
(路徑為:libpthread-416.11.1/private/tsd_private.h,spinlock_private.h
)拷貝到新建YYCommon/pthread文件夾中;
問題六: System/machine/cpu_capabilities.h' file not found
- 解決方案: 在objc4-781的根目錄下的YYCommon文件夾下新建System/machine文件夾;
- 將依賴文件
xnu6153.11.26
下的cpu_capabilities.h
(路徑為:xnu6153.11.26/osfmk/machine/cpu_capabilities.h
)拷貝到新建YYCommon/System/machine文件夾中角虫;
問題七: 'os/tsd.h' file not found
- 解決方案:將依賴文件
xnu6153.11.26
下的tsd.h
(路徑為:xnu6153.11.26/libsyscall/os/tsd.h
)拷貝到新建YYCommon/os文件夾中沾谓;
問題八: 'System/pthread_machdep.h' file not found
- 解決方案: 將依賴文件
Libc-583
下的pthread_machdep.h
(路徑為:Libc-583/pthreads/pthread_machdep.h
)拷貝到新建YYCommon/System文件夾中;
問題九: 'CrashReporterClient.h' file not found
- 解決方案:將依賴文件
Libc-825.24
下的CrashReporterClient.h
(路徑為:Libc-825.24/include/CrashReporterClient.h
)拷貝到新建YYCommon文件夾中戳鹅; - 工程配置在
Build Settings -> Preprocessor Macros
中加入:
LIBC_NO_LIBCRASHREPORTERCLIENT
- 如果還是報錯CrashReporterClient 的問題均驶,解決方法: 在
BuildSetting --> Other Linker Flags
中去掉CrashReporterClient
;
問題十: 'objc-shared-cache.h' file not found
- 解決方案:將依賴文件
dyld-733.6
下的objc-shared-cache.h
(路徑為:dyld-733.6/include/objc-shared-cache.h
)拷貝到新建YYCommon文件夾中枫虏;
問題十一: 'kern/restartable.h' file not found
- 解決方案:在objc4-781的根目錄下的YYCommon文件夾下新建kern文件夾妇穴;
- 將依賴文件
xnu6153.11.26
下的restartable.h
(路徑為:xnu6153.11.26/osfmk/kern/restartable.h
)拷貝到新建YYCommon/kern文件夾中;
問題十二: Mismatch in debug-ness macros
- 解決方案:注釋掉objc-runtime.mm中的#error mismatch in debug-ness macros隶债;
問題十三: '_simple.h' file not found
- 解決方案:將依賴文件
libplatform-220
下的_simple.h
(路徑為:libplatform-220/include/_simple.h
)拷貝到新建YYCommon文件夾中腾它;
問題十四: ''Block_private.h' file not found
- 解決方案:將依賴文件
libclosure-74
下的Block_private.h
(路徑為:libclosure-74/Block_private.h
)拷貝到新建YYCommon文件夾中;
問題十五: 'can't open order file: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/AppleInternal/OrderFiles/libobjc.order
- 解決方案:在工程中配置:
target -> objc -> Build Settings -> Order File
中添加路徑$(SRCROOT)/libobjc.order
問題十六: library not found for -lCrashReporterClient
- 解決方案:在工程中配置:
target -> objc -> Build Settings -> Other Linker Flags
Debug與Release模式下的Any macOS SDK 找到lCrashReporterClient刪除掉死讹;
問題十七: /xcodebuild:1:1: SDK "macosx.internal" cannot be located
解決方案:
- 在工程中配置:
targets -> Build Phases -> Run Script
中的macosx.internal改成macosx
- 上面的所有問題解決完,objc4-781源碼工程就能編譯成功了,完整的工程文件如下:
在objc4-781源碼工程中新建Target 命名為YYTest,然后配置最后可以進行源碼調試了瞒滴;
- 新建Target 命名為YYTest;
YYTest的工程配置
1.給YYTest綁定依賴關系,
YYTest -> Build Phases -> Dependencies
添加objc
-
2.給YYTest添加庫,
YYTest -> Build Phases -> Link Binary With Libraries
添加libobjc.A.dylib
YYTest中的斷點調試設置
-
打斷點調試發(fā)現(xiàn)斷點無效;
-
解決方案:YYTest -> Build Phases -> Compile Sources中 將main.m拖到最上面;
2.源碼中的斷點無效;
- 解決方案:
Build Setting --> 將Enable Hardened Runtime 置為NO