objc818編譯
一、準(zhǔn)備工作
Xcode:Version 12.3
macOS:Version 10.15.7
objc源碼:objc4-818.2.tar.gz
二、開始配置
使用Xcode打開解壓后的objc源碼。直接編譯objc,此時(shí)需要修改Xcode提示的錯(cuò)誤。
-
【錯(cuò)誤1】
描述:unable to find sdk 'macosx.internal'。
解決辦法:- 設(shè)置 “TARGETS->objc->Build Setting->Base SDK”,將其值設(shè)置為“macOS”。
- 設(shè)置 “TARGETS->objc-trampolines->Build Setting->Base SDK”,將其值設(shè)置為“macOS”。
-
【錯(cuò)誤2】
描述:“'sys/reason.h' file not found”
解決辦法:- 在Apple Source中找到“xnu-7195.50.7.100.1 -> bsd -> sys -> reason.h”文件并下載。
- 在項(xiàng)目中添加自定義文件夾,用于存放該文件。
- 在“TARGETS -> objc -> Build Setting -> Heard Search Path"中添加自定義文件夾的路徑。
【錯(cuò)誤3】
描述:“dyld_priv.h:160:148: Expected ','”
解決辦法:將“bridgeos(3.0)”去掉。如下:
//將含有bridgeos(3.0)的代碼注釋
//extern dyld_platform_t dyld_get_base_platform(dyld_platform_t platform) __API_AVAILABLE(macos(10.14), iOS(12.0), watchos(5.0), tvos(12.0), bridgeos(3.0));
//修改后的代碼
extern dyld_platform_t dyld_get_base_platform(dyld_platform_t platform) __API_AVAILABLE(macos(10.14), iOS(12.0), watchos(5.0), tvos(12.0));
-
【錯(cuò)誤4】
描述:“'mach-o/dyld_priv.h' file not found“
解決辦法:- 在Apple Source中找到“dyld-832.7.1 -> include -> mach-o -> dyld_priv.h”文件并下載。
- 將該文件拷貝至項(xiàng)目中的自定義文件夾中。
-
【錯(cuò)誤5】
描述:“'os/lock_private.h'/'os/base_private.h' file not found”
解決辦法:- 在Apple Source中找到“l(fā)ibplatform-254.40.4 --> private --> os --> lock_private.h 、base_private.h”文件并下載。
- 將該文件拷貝至項(xiàng)目中的自定義文件夾中。
-
【錯(cuò)誤6】
描述:“'pthread/tsd_private.h'/'pthread/spinlock_private.h' file not found”
解決辦法:- 在Apple Source中找到“l(fā)ibplatform-254.40.4 --> private --> tsd_private.h、spinlock_private.h”文件并下載。
- 將該文件拷貝至項(xiàng)目中的自定義文件夾中。
-
【錯(cuò)誤7】
描述:“'System/machine/cpu_capabilities.h' file not found”
解決辦法:- 在Apple Source中找到“l(fā)ibplatform-254.40.4 --> private --> tsd_private.h、spinlock_private.h”文件并下載。
- 將該文件拷貝至項(xiàng)目中的自定義文件夾中。
-
【錯(cuò)誤8】
描述:“'os/tsd.h' file not found”
解決辦法:- 在Apple Source中找到“xnu-7195.50.7.100.1 --> libsyscall --> os --> tsd.h”文件并下載。
- 將該文件拷貝至項(xiàng)目中的自定義文件夾中。
-
【錯(cuò)誤9】
描述:“'System/pthread_machdep.h' file not found”
解決辦法:- 在Apple Source中找到“Libc-583/pthreads/pthread_machdep.h”文件并下載。
- 注意:在最新版的libc中沒有這個(gè)文件,需要在“Libc-583”中下載。
- 將該文件拷貝至項(xiàng)目中的自定義文件夾中。
-
【錯(cuò)誤10】
描述:“'CrashReporterClient.h' file not found”
解決辦法:- 在Apple Source中找到“Libc-825.24/include/CrashReporterClient.h”文件并下載。
- 將該文件拷貝至項(xiàng)目中的自定義文件夾中。
- 注意:該文件添加之后仍然報(bào)錯(cuò),主要是因?yàn)楹辍癓IBC_NO_LIBCRASHREPORTERCLIENT”示定義的原因。
- 解決1:在"Build Settings -> Preprocessor Macros"中添加“LIBC_NO_LIBCRASHREPORTERCLIENT”宏定義。
- 解決2:在“CrashReporterClient.h”文件起始處,加入“#define LIBC_NO_LIBCRASHREPORTERCLIENT”。
【錯(cuò)誤11】
描述:"'os/feature_private.h' file not found"
解決辦法:
直接將該引用的頭文件注釋。-
【錯(cuò)誤12】
描述:“'objc-shared-cache.h' file not found”
解決辦法:- 在Apple Source中找到“dyld-832.7.1 --> include --> objc-shared-cache.h”文件并下載。
- 將該文件拷貝至項(xiàng)目中的自定義文件夾中。
【錯(cuò)誤13】
描述:“'objc-bp-assist.h' file not found”
解決辦法:
直接將該引用的頭文件注釋。【錯(cuò)誤14】
描述:“Use of undeclared identifier 'dyld_platform_version_macOS_10_13'”
解決辦法:
直接定位到該段代碼,并注釋掉。如下所示
// if (!dyld_program_sdk_at_least(dyld_platform_version_macOS_10_13)) {
// DisableInitializeForkSafety = true;
// if (PrintInitializing) {
// _objc_inform("INITIALIZE: disabling +initialize fork "
// "safety enforcement because the app is "
// "too old.)");
// }
// }
- 【錯(cuò)誤15】
描述:“'_simple.h' file not found”
解決辦法:- 在Apple Source中找到“l(fā)ibplatform-254.40.4 --> private --> _simple.h”文件并下載。
- 將該文件拷貝至項(xiàng)目中的自定義文件夾中。
- 【錯(cuò)誤16】
描述:“'kern/restartable.h' file not found”
解決辦法:- 在Apple Source中找到“xnu-7195.50.7.100.1 --> osfmk --> kern -->restartable.h”文件并下載。
- 將該文件拷貝至項(xiàng)目中的自定義文件夾中。
- 【錯(cuò)誤17】
描述:“'Block_private.h' file not found”
解決辦法:- 在Apple Source中找到“l(fā)ibclosure-78 --> Block_private.h”文件并下載。
- 將該文件拷貝至項(xiàng)目中的自定義文件夾中。
- 【錯(cuò)誤18】
描述:"objc-cache.mm:1122:33: Use of undeclared identifier 'objc_thread_get_rip'"
解決辦法:
將代碼直接注釋,如下所示
//#if TARGET_OS_OSX
// if (oah_is_current_process_translated()) {
// kern_return_t ret = objc_thread_get_rip(threads[count], (uint64_t*)&pc);
// if (ret != KERN_SUCCESS) {
// pc = PC_SENTINEL;
// }
// } else {
// pc = _get_pc_for_thread (threads[count]);
// }
//#else
pc = _get_pc_for_thread (threads[count]);
//#endif
- 【錯(cuò)誤19】
描述:"Can't open order file: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.1.sdk/AppleInternal/OrderFiles/libobjc.order"
解決辦法:- 找到“TARGETS -> objc -> Build Setting -> Linking -> Order File”,修改成“$(SRCROOT)/libobjc.order”
- 【錯(cuò)誤20】
描述:“Library not found for -lCrashReporterClient”
解決辦法:- 找到“TARGETS -> objc -> Build Setting -> Other Link Flags”,刪除“-lCrashReporterClient”。
- 【錯(cuò)誤21】
描述:“Library not found for -loah”
解決辦法:- 找到“TARGETS -> objc -> Build Setting -> Other Link Flags”,刪除“-loah”。
- 【錯(cuò)誤22】
描述:“ObjectiveC.apinotes 異?!?br> 解決辦法:- 選擇“TARGETS -> objc -> Build Settings -> Text-Based InstallAPI Verification Model”中選擇“Errors Only”。
- 清除“Other Text-Based InstallAPI Flags”中的所有內(nèi)容。
至此,已經(jīng)能完全編譯成功了。
三、開始調(diào)試
-
新建一個(gè) Target : HQObjc
新建項(xiàng)目 -
添加綁定關(guān)系
添加綁定關(guān)系 -
此時(shí)運(yùn)行代碼,就能進(jìn)入到源碼中了。
image.png
注意:如果經(jīng)過1、2步無(wú)法斷點(diǎn)到源碼中,需要完成以下兩步:
* 找到“HQObjc -> Build Setting -> Enable Hardended Runtime”,將其設(shè)置為“NO”。
* 確保編譯的源文件中,“main.m”處于第一位。
最終編譯通過的源碼路徑為:objc4-818可編譯源碼


