iOS开发之runtime(13):runtime编译过程

logo

本系列博客是本人的源码阅读笔记,如果有 iOS 开发者在看 runtime 的,欢迎大家多多交流。为了方便讨论,本人新建了一个微信群(iOS技术讨论群),想要加入的,请添加本人微信:zhujinhui207407,【加我前请备注:ios 】,本人博客http://www.kyson.cn 也在不停的更新中,欢迎一起讨论

本文完整版详见笔者小专栏:https://xiaozhuanlan.com/runtime

背景

上一篇文章我们讲到runtime库中区__objc_init_func替代了区__mod_init_func。因此我们在runtime编译好的库文件中看不到区__mod_init_func

那么这个替换的过程是怎么进行的呢,本文将为读者分析。

分析

大家知道,库的编译参数都是在target中进行设置的,如图:


编译的文件名

如图,如果我们设置
EXECUTABLE_PREFIXlibbb那么库文件的前缀就是libbb,
PRODUCT_NAMEobjc.AB那么紧跟着的就是objc.AB了,不难得出,最终的文件名为:

libbbobjc.AB.dylib

接着我们看其他编译参数,主要是如图所示位置:


编译语法

复制下来如下:

set -x
/usr/bin/xcrun -sdk macosx clang++ -Wall -mmacosx-version-min=10.9 -arch x86_64 -std=c++11 "${SRCROOT}/markgc.cpp" -o "${BUILT_PRODUCTS_DIR}/markgc"
"${BUILT_PRODUCTS_DIR}/markgc" "${BUILT_PRODUCTS_DIR}/libobjc.A.dylib"

根据我们对clang的了解,这句命令应该不难理解。

set x

略过,应该是设置环境变量之类的操作。

/usr/bin/xcrun -sdk macosx clang++ -Wall -mmacosx-version-min=10.9 -arch x86_64 -std=c++11 "${SRCROOT}/markgc.cpp" -o "${BUILT_PRODUCTS_DIR}/markgc"
"${BUILT_PRODUCTS_DIR}/markgc" "${BUILT_PRODUCTS_DIR}/libobjc.A.dylib"

可以看出是调用的xcrun命令,关于xcrun,其实大家可以理解为xcodebuild命令的老版本,笔者之前曾经写过一篇相关的文章:
iOS使用fastlane一键打包审核大家可以参考一下。
这里几个参数大概介绍一下:
-sdk macosx
意思就是运行平台在mac上
-mmacosx-version-min=10.9
是指定mac的最低版本
-arch x86_64
指定平台是x86_64

"${SRCROOT}/markgc.cpp"

指明编译的文件

-o "${BUILT_PRODUCTS_DIR}/markgc"
"${BUILT_PRODUCTS_DIR}/markgc" "${BUILT_PRODUCTS_DIR}/libobjc.A.dylib"

指明输出目录以及文件名。

因此不难看出,这里脚本的含义就是对编译后的runtime再进行读取,并编译markgc的过程。而在编译markgc的时候再进行了对区__objc_init_func替代区__mod_init_func的操作。

总结

本文讲解了runtime编译过程中的参数设置,以及__objc_init_func替代区__mod_init_func的原理,希望对大家有所帮助。

广告

我的首款个人开发的APP壁纸宝贝上线了,欢迎大家下载。

壁纸宝贝

你可能感兴趣的:(iOS开发之runtime(13):runtime编译过程)