其他分享
首页 > 其他分享> > 1、objc4-818.2编译踩坑总结篇

1、objc4-818.2编译踩坑总结篇

作者:互联网

1、关于objc4源码问题

可在Cooci处下载编译完成的源码、

2、手动体验源码编译过程

苹果原版源码下载地址、
在这里插入图片描述
macOS 11.3系统下的objc4-824未下载下来、获取11.2系统下的 objc4-818.2版本

3、源码需要的部分系统文件

源码获取下来后将面临一系列各个系统库获取的头文件缺失的报错问题、根据750、781等版本编译问题可一并总结下来缺失的那些文件可为公共部分、具体差异可自行对比。主要从以下几个源文件获取、可尝试从0到1找寻:玩过几次就不想这么折腾了。
libpthread
xnu
Libc
dyld
libdispatch
libplatform
libclosure
在这里插入图片描述

4、获取818.2源码之后、如图添加头文件到项目并且配置搜索路径

5、接下来开始解决报错之旅

1.常见的系统报错:unable to find sdk 'macosx.internal'

在这里插入图片描述
解决方法:
在这里插入图片描述

2.‘os/feature_private.h’ file not found
在这里插入图片描述

//    if (!os_feature_enabled_simple(objc4, preoptimizedCaches, true)) {
//        DisablePreoptCaches = true;
//    }
  1. Use of undeclared identifier ‘dyld_fall_2020_os_versions’
    在这里插入图片描述
//if (!dyld_program_sdk_at_least(dyld_fall_2020_os_versions))
 //       DisableAutoreleaseCoalescingLRU = true;

4.‘objc-bp-assist.h’ file not found
注释掉
5.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.)");
//            }
//        }

6.Use of undeclared identifier ‘dyld_platform_version_macOS_10_11’

//        if (!dyld_program_sdk_at_least(dyld_platform_version_macOS_10_11)) {
//            DisableNonpointerIsa = true;
//            if (PrintRawIsa) {
//                _objc_inform("RAW ISA: disabling non-pointer isa because "
//                             "the app is too old.");
//            }
//        }

7.Use of undeclared identifier ‘dyld_fall_2018_os_versions’
在这里插入图片描述

8.常见又熟悉的错误Use of undeclared identifier ‘CRGetCrashLogMessage’
看出处在CrashReporterClient.h文件中。
在这里插入图片描述

//#if !TARGET_OS_WIN32
//#include <os/linker_set.h>
//#endif

注释掉调用代码

//    LINKER_SET_FOREACH(_dupi, const objc_duplicate_class **, "__objc_dupclass") {
//        const objc_duplicate_class *dupi = *_dupi;
//
//        if (strcmp(dupi->name, name) == 0) {
//            return;
//        }
//    }

10、‘Cambria/Traps.h’ file not found

#if TARGET_OS_OSX
//#include <Cambria/Traps.h>
//#include <Cambria/Cambria.h>
#endif

相对应的注释掉其中的调用代码、oah_is_current_process_translated、保留调用的线程执行处

        // Find out where thread is executing
//#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

11.LINKER_SET_FOREACH
在这里插入图片描述
12.Use of undeclared identifier ‘dyld_platform_version_bridgeOS_2_0’
老SDK的兼容代码
在这里插入图片描述


//        if (DebugPoolAllocation || sdkIsAtLeast(10_12, 10_0, 10_0, 3_0, 2_0)) {
//            // OBJC_DEBUG_POOL_ALLOCATION or new SDK. Bad pop is fatal.
//            _objc_fatal
//                ("Invalid or prematurely-freed autorelease pool %p.", token);
//        }

13.最后熟悉的 library not found 未找到符号、什么符号呢?

6、解决完上述的这么些问题、就Build Success !!! 熟悉么?

在这里插入图片描述

7、这个时候创建个调试的Target

在这里插入图片描述

8.调试运行

9、隐藏文件

10、第四种探索手段LLDB调试要不要玩一下?

`(lldb) breakpoint set --func-regex (.*)[a|A]llo[c|C](.*)
Breakpoint 2: 82902 locations.`

在这里插入图片描述

(lldb) breakpoint set --func-regex (.*)[a|A]llo[c|C](.*) -s libobjc.A.dylib
Breakpoint 3: 515 locations.
libobjc.A.dylib was compiled with optimization - stepping may behave oddly; variables may not be available.

具体再精简下断点处、可根据具体所走方法总结正则表达式、有兴趣自行去玩、你学到了么?

标签:10,undeclared,objc,编译,818.2,objc4,dyld,os,源码
来源: https://blog.csdn.net/SharkToping/article/details/117619700