Runtime编译环境搭建

首先,需要准备的资源:runtime完整源码,这个可以在苹果开放资源网页找到。点进这个页面,接着点击macOS下面的最新版本,在新页面中command+f搜索objc即可找到runtime源码,再点击右边的下载按钮即可得到。

到这里runtime源码已经准备好,除此之外,runtime源码的编译还需要添加一些必要的依赖。点击这里可以直达下载页面。

在这个资源页面找到以下开源代码,下载好合适的版本,然后解压到同一个目录下,目录名可以起名为opensources,留着备用。

  • Libc
  • dyld
  • libauto
  • libclosure
  • libdispatch
  • xnu
  • libpthread
  • launchd
  • libplatform

下面开始正式编译流程

command+b编译objc,报错:The i386 architecture is deprecated. You should update your ARCHS build setting to remove the i386 architecture. (in target 'objc')The i386 architecture is deprecated. You should update your ARCHS build setting to remove the i386 architecture. (in target 'objc-trampolines'),选择objc->TARGETS objc->build settings->architecture,将releasedebug模式都改为Standard Architectures

继续command+b编译, 提示'sys/reason.h' file not found,在项目目录下创建一个文件夹include,用于存放所有需要导入工程的文件,并且把它添加到项目的Header Search Paths中,依次选择objc->TARGETS->objc->Build Settings,搜索框中输入header search path,然后加入$(SRCROOT)/include

接下来需要去已下载好的开源项目中寻找reason.h头文件了,方式有两种:

  • 使用命令行: 进入刚才创建的开源代码目录下 cd ../opensources,这里需要按照自己的实际路径来cd

    搜索文件名 find . -name ‘reason.h’

    可以看到搜索结果显示在./xnu-4903.221.2/bsd/sys/reason.h中,按照这个路径找到reason.h文件,根据编译错误提示知道,这个reason.h文件在路径sys下,那么在已创建的include文件下创建一个新的sys文件夹,里面放入找到的reason.h文件:

  • 普通搜索 直接在Opensource中搜索reason.h文件,接下来处理和上述一样。

  • 再次编译,提示'mach-o/dyld_priv.h' file not found 选择./dyld-551.3/include/mach-o/dyld_priv.h,和上述同样操作,不再重述。

  • 提示'os/lock_private.h' file not found 选择./libplatform-177.200.16/private/os/lock_private.h

  • 提示'os/base_private.h' file not found 选择./libplatform-177.200.16/private/os/base_private.h

  • 提示'pthread/tsd_private.h' file not found 选择./libpthread-330.220.2/private/tsd_private.h

  • 提示'System/machine/cpu_capabilities.h' file not found 选择./xnu-4903.221.2/osfmk/machine/cpu_capabilities.h

  • 提示'os/tsd.h' file not found 选择./xnu-4903.221.2/libsyscall/os/tsd.h

  • 提示'pthread/spinlock_private.h' file not found 选择./libpthread-330.220.2/private/spinlock_private.h

  • 提示'System/pthread_machdep.h' file not found 选择./Libc-825.40.1 2/pthreads/pthread_machdep.h

  • 提示Typedef redefinition with different types ('int' vs 'volatile OSSpinLock' (aka 'volatile int’)) 这种redefinition错误时,在include文件夹下使用grep命令:

// 如 重复定义 pthread_lock_t
grep -rne "typedef.*pthread_lock_t” .
// 输出
./pthread/spinlock_private.h:59:typedef volatile OSSpinLock pthread_lock_t __deprecated_msg("Use <os/lock.h> instead”);
./System/pthread_machdep.h:214:typedef int pthread_lock_t;
复制代码

可以看见有两处定义了pthread_lock_t,注释掉pthread_machdep.h文件中的定义即可。

  • 提示Static declaration of '_pthread_getspecific_direct' follows non-static declaration
这里有三个函数定义重复了:_pthread_has_direct_tsd(void)_pthread_getspecific_direct(unsigned long slot)_pthread_setspecific_direct(unsigned long slot, void * val)
grep -re "_pthread_has_direct_tsd(void)” .
//输出
./pthread/tsd_private.h:_pthread_has_direct_tsd(void)
./System/pthread_machdep.h:_pthread_has_direct_tsd(void)grep -re "_pthread_getspecific_direct(unsigned long slot)” .
//输出
./pthread/tsd_private.h:_pthread_getspecific_direct(unsigned long slot)
./System/pthread_machdep.h:_pthread_getspecific_direct(unsigned long slot)
grep -re "_pthread_setspecific_direct(unsigned long slot, void \* val)” .
//输出
./pthread/tsd_private.h:_pthread_setspecific_direct(unsigned long slot, void * val)
./System/pthread_machdep.h:_pthread_setspecific_direct(unsigned long slot, void * val)
这里选择把pthread_machdep.h文件中的定义注释掉。
复制代码
  • 提示'CrashReporterClient.h' file not found 选择./Libc-825.40.1 2/include/CrashReporterClient.h,放入include文件夹下之后还是报错,需要在Build Settings->Preprocessor Macros中加入:LIBC_NO_LIBCRASHREPORTERCLIENT
  • 提示'Block_private.h' file not found 选择./libdispatch-1008.220.2/src/BlocksRuntime/Block_private.h
  • 提示'objc-shared-cache.h' file not found 选择./dyld-551.3/include/objc-shared-cache.h
  • 提示Use of undeclared identifier ‘DYLD_MACOSX_VERSION_10_13 在 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
复制代码
  • 提示'_simple.h' file not found 选择./libplatform-177.200.16/private/_simple.h

  • 提示'isa.h' file not found isa.h文件在项目的runtime文件夹中,新加入的一个头文件。 直接把它引入include文件夹中去即可。

  • 提示can't open order file: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/AppleInternal/OrderFiles/libobjc.order 修改工程配置,将Build Settings->Linking->Order File改为工程根目录下的libobjc.order,即:$(SRCROOT)/libobjc.order。

  • 提示library not found for -lCrashReporterClient 此时在 Build Settings -> Linking -> Other Linker Flags里删掉"-lCrashReporterClient"(Debug和Release都删了)

  • 提示SDK "macosx.internal" cannot be located.和unable to find utility "clang++", not a developer tool or in PATH 把Target-objc的Build Phases->Run Script(markgc)里的内容macosx.internal改为macosx,这里我猜测macosx.internal为苹果内部的macosx,说的不对,大家指出来。

  • 提示no such public header file: '/tmp/objc.dst/usr/include/objc/ObjectiveC.apinotes’ 这里需要把Target-objc的Build Settings->Other Text-Based InstallAPI Flags里的内容设为空! 并且一定记得要把Text-Based InstallAPI Verification Model里的值改为Errors Only

Runtime编译环境搭建相关推荐

  1. esp32 linux内核,【小狂系列】跟着小狂玩ESP32之编译环境搭建篇

    本帖最后由 3guoyangyang7 于 2016-11-3 18:41 编辑 趁热要打铁,昨天发了ESP32的预告贴,今天小狂就带大家刷一刷ESP32的编译环境搭建.怎么说的,ESP32可以在多平 ...

  2. Windows编译环境搭建(VS2010)

    引言:   本篇文章基于教程目的(由于windows和linux相关环境搭建篇幅过大,在博客中做这些讲解),主要描述Windows的发展历程和编译环境搭建(基于 Visual Studio 2010版 ...

  3. spring-framework-5.1.x 源码编译 环境搭建 [ idea:2020.1 ]

    spring-framework-5.1.x 源码编译 环境搭建 [ idea:2020.1 ] 一. Gradle下载与安装 软件名称 版本 下载地址 jdk jdk 11.0.5 下载链接 提取码 ...

  4. python hackrf_HackRF固件更新及编译环境搭建

    1 HackRF Host 软件更新 git pull cd host mkdir build cmake ../ -DINSTALL_UDEV_RULES=ON make sudo make ins ...

  5. 全志JAVA_android 全志a10(2.3.4)开发1(编译环境搭建)

    android 全志a10(2.3.4)开发一(编译环境搭建) android系统编译可分为两部分:一部分是linux内核编译:另一部分是android源码编译:全文中主要是说明从搭建编译环境,安装编 ...

  6. Hi3516DV300编译环境搭建问题及解决

    Hi3516DV300编译环境搭建问题及解决 1.安装完工具链,提示找不到gcc 问题: bash: /opt/hisi-linux/x86-arm/arm-hisiv300-linux/target ...

  7. FMT(基于rtthread)开源代码编译 win10下编译环境搭建及编译

    FMT(基于rtthread)开源代码编译 win10下编译环境搭建及编译 什么是Firmament? Firmament (FMT) 是一款基于模型设计 (Model-Based-Design, M ...

  8. 鸟人的Android揭秘(3)——Android 编译环境搭建

    一.主机环境要求 要顺利编译 Android 源代码,硬件环境和操作系统都必须满足一定的条件.官方推荐的硬件环境配置是: 编译 Gingerbread(2.3.x)及后续版本必须使用64位系统 需至少 ...

  9. android studio ndk HelloWorld 编译环境搭建

    android studio NDK helloworld 项目 第一步 android studio ndk 编译环境搭建 http://yunpan.cn/c3cCxxgwrqDaL 访问密码 6 ...

最新文章

  1. 一个冷僻的知识点try直接返回finally里的设置null其实无效
  2. 【Android基础】点击Back键退出应用程序
  3. java并发编程系列-内存模型基础
  4. ISO9000互联网管理办法
  5. ByteBuffer
  6. 哈希表和有序表的简单介绍
  7. mysql的每隔1分钟定时_简单易用,spring boot集成quartz,实现分布式定时任务
  8. Android开发笔记(一百一十六)网络学习资源
  9. SQL Server Integration Services(SSIS)中的脚本任务调试
  10. 【windows核心编程】第二章 字符和字符串处理
  11. tcp/ip协议listen函数中backlog参数的含义
  12. wps直接打开CVS文件会把长串数字订单号最后4位变为0
  13. Spiceworks数据统计:Win10发布半年使用情况
  14. 复杂美吴思进出席浙江公共政策研究院“数字赋能与浙江智造”沙龙
  15. AI巨头宝座易主,百度击败谷歌亚马逊,势不可挡!
  16. UI界面视觉设计之图片和图标
  17. 【数学】第一型曲线积分
  18. 运维自动化之ANSIBLE
  19. 面试常用mysql语句_50个常用的笔试、面试sql语句
  20. oracle创建表空间、临时表空间

热门文章

  1. 嵌入式开发有年龄限制吗_2021年考监理工程师有年龄限制吗?女生可以考监理工程师吗?...
  2. linux把文件复制到压缩包里,Linux学习笔记(二十)文件压缩 zip压缩、tar打包、打包、解包...
  3. php7 v8js,Centos 7PHP7.0 安装V8JS扩展几乎都能安装成功
  4. tf.keras.layers.Conv2D 示例
  5. blender 导出 obj 格式,3dsmax 导入3ds max obj 格式数据
  6. mysql存储引擎6_Mysql各种存储引擎对比总结
  7. emmc linux.格式化参数,大家都是怎么格式化emmc芯片的?能在ADB SHELL 中操作吗?uboot 就实现了GPT分区和烧录功能...
  8. APUE(第四章)文件和目录
  9. Linux系统编程——进程基础知识
  10. android代码修改excel文件格式,Android实现类似execel的表格 能回显并能修改表格内容的方法...