绝大部分开发者开发 iOS 或者 Mac APP 都会选择 Xcode 集成开发环境。Xcode 是一款强大的 GUI IDE,集开发、编译、调试和代码分析于一体,而在这背后,则是一系列工具的支撑,本文聊聊 Xcode 在编译过程涉及的工具及其作用。 —— 由网易云捕分享

“民之失德,乾糇以愆;他山之石,可以攻玉。”- 《诗经》

绝大部分开发者开发iOS或者Mac APP 都会选择Xcode集成开发环境。Xcode是一款强大的GUI IDE,集开发、编译、调试和代码分析于一体,而在这背后,则是一系列工具的支撑,本文聊聊Xcode在编译过程涉及的工具及其作用。

一、编译ToolChina初窥

图1展示了在Xcode中选择Build时编译工程test-toolchain时的过程:查看图片
图1:Build工程test-toolchain时的过程
     
       从图1中可以看见,在Xcode中点击Build后,Xcode首先调用工具mkdir创建product目录,然后调用clang编译源码文件和链接生成可执行文件,调用ibtool编译storyboard文件,调用actool编译Asset文件等。可能是考虑到GUI的简洁和局限,Xcode并没有给出所有的编译涉及到的工具,我们通过命令行的方式来探索下~~

二、“黑乎乎”版的Xcode:xcodebuild

2.1 xcodebuild命令行编译Xcode工程

xcodebuild是编译Xcode工程的命令行工具,比如可用如下命令编译test-toolchain工程:

xcodebuild -project test-toolchain.xcodeproj -configuration Debug build

上面的命令表示:编译debug版本的test-toolchain,xcodebuild支持众多的选项配置,不指定会使用默认的设置。
      
       命令行的输出显示了更多的细节,如下部分片段:

=== BUILD TARGET test-toolchain OF PROJECT test-toolchain WITH CONFIGURATION Debug ===
Check dependencies
Write auxiliary files
write-file /Users/netease/Desktop/ForTestApp/test-toolchain/...
...
Create product structure /bin/mkdir -p /Users/netease/Desktop/ForTestApp/.../test-toolchain.app
...
** BUILD SUCCEEDED **

在其中,我们发现暴露了新的工具,如:builtin-productPackagingUtility打包工具、codesign签名工具等。那么,还有方法暴露更多的编译细节出来吗?请向下看~~
 注意: xcodebuild命令行编译工具和xcode IDE的编译环境变量是不一样的,xcodebuild默认是当前工程目录的build目录,而ide默认是/Users/用户名/Library/Developer/Xcode/DerivedData/Build/Intermediates/

2.2 Patch版的xcodebuild编译Xcode工程

利用DYLD_INSERT_LIBRARIES实现对Mac程序的动态库注入已经广为人知,在执行文件加载时,会调用注入库的构造函数,我们可以在这里将执行文件的名字打印出来,从而获取xcodebuild编译更多的细节。
动态库代码(名字为test_injector)如图2:
查看图片
图2:动态库test_injector代码

将injector编译,得到库:test_injector.dylib,然后注入到xcodebuild,如下:

DYLD_INSERT_LIBRARIES=./test_injector.dylib xcodebuild -project test-toolchain.xcodeproj -configuration Debug build

这次得到的信息如下:

2016-07-28 19:00:53.874 xcodebuild[2038:85610] tool name:xcodebuild
2016-07-28 19:00:53.904 xcodebuild[2038:85610] tool name:xcodebuild
=== BUILD TARGET test-toolchain OF PROJECT test-toolchain WITH CONFIGURATION Debug ===Check dependencies
2016-07-28 19:00:54.396 sh[2042:85682] tool name:sh
2016-07-28 19:00:54.426 sh[2045:85685] tool name:sh
...
CompileC build/test-toolchain.build/Debug-iphoneos/...
2016-07-28 19:00:54.470 xcexec[2047:85693] tool name:xcexec
2016-07-28 19:00:54.481 clang[2047:85693] tool name:clang
2016-07-28 19:00:54.492 clang[2051:85701] tool name:clang
...
** BUILD SUCCEEDED **

可以看见,信息进一步丰富了,比如工具xcexec等。

三、Xcode编译Toolchain汇总

使用patch版的xcodebuild,我们获得了Xcode在编译一个工程时所涉及的工具图谱,总结的信息见下表1:
表1:Xcode 编译 ToolChain介绍

工具名称 用途介绍
xcodebuild 编译Xcode工程的命令行工具
sh Shell工具
mkdir 创建目录
xcexec 执行wrapper
clang 编译器,内部封装了编译、优化过程
ld 链接器
ibtool nib资源文件本地化
ibtoold 资源文件链接
actool asset资源文件编译
builtin-infoPlistUtility Plist文件编译工具
builtin-productPackagingUtility 打包工具
touch 文件创建
codesign 创建、查看和修改签名
codesign_allocate 为Mach-O文件增加签名数据
builtin-validationUtility 校验工具

获得这些信息有什么好处呢,这个就是仁者见仁了,比如获取clang编译源码文件的时间,这儿也可当做一个切入点。

聊聊 Xcode 编译 ToolChain相关推荐

  1. linker command failed with exit code 1 (use -v to see invocation),经典Xcode编译错误的出现和解决!...

    linker command failed with exit code 1 (use -v to see invocation)这个肯定是个xcode编译运行的时候经典的报错了. 这个问题曾经在我的 ...

  2. UI控件问题和XCode编译警告和错误解决方法集锦 (持续更新ing)

    UI控件问题集锦 第一 图片无法在UIImageview上显示: 原因如下: 1.没有设置宽高(或者宽高为0) 2.位置不对 3.hidden=YES 4.没有添加到控制器的view上面 第二 一个U ...

  3. 【Cocos2d-X(2.x) 游戏开发系列之二】cocos2dx最新2.0.1版本跨平台整合NDK+Xcode编译到Android...

    本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/hibernate/783.html ☞ 点击 ...

  4. iOS进阶--提高XCode编译速度、Xcode卡顿解决方案

    提升编译链接的速度主要有以下三个方式: 1. 提高XCode编译时使用的线程数 defaults write com.apple.Xcode PBXNumberOfParallelBuildSubta ...

  5. linux编译poco静态库,iOS——为Xcode编译POCO C++静态库

    一.POCO C++ library简介 POCO C++ library是一个C++编写的跨平台库,主要实现网络连接.数据库管理以及服务器,适用于跨平台.嵌入式. 二.为Xcode编译POCO C+ ...

  6. 用xcode编译c++代码

    原先的cpp代码是用vc写的,现在想用xcode来编译,因为原本也是命令行调用,不涉及到UI层面的东西,代码也比较简单,就是一个cpp文件包含一个h文件. 方法就是打开xcode,新建项目,然后选择O ...

  7. Unity Xcode编译报错XCTest/XCTest.h file not found

    Xcode编译报错 XCTest/XCTest.h file not found 解决方法: 在报错的Target中的Building settings中 FRAMEWORK_SEARCH_PATHS ...

  8. xcode 编译提速

    1. 提高XCode编译时使用的线程数 代码如下:  defaults write com.apple.Xcode PBXNumberOfParallelBuildSubtasks 4 XCode默认 ...

  9. 利用Injection插件加快Xcode编译速度

    我们在调试iOS原生代码时,每次修改都需要Command+R来重新编译运行.当项目代码量很大,编译时间就会很漫长.因此对于开发中来说,如果能加快编译速度,能大大提高生产效率.如果我们能像Swift P ...

  10. xcode 编译静态库所要注意

    一 建立静态库 1. 生成静态库工程 2. release/debug 的选择  scheme 3. 编译(注意真机与模拟器的产物)==>  lipo -create [源文件路径1]  [源文 ...

最新文章

  1. Linux 内核测试版与稳定版的版本号有什么不同?
  2. linux RTX2080显卡驱动
  3. cv::inRange的作用,注意它的区间是闭区间,而不是开区间...
  4. pp助手苹果版_生日助手时间管理软件免费版下载-生日助手倒计时app苹果版下载ios...
  5. 为什么大学打印店老板多是湖南人?
  6. 的环境下 qt 运行在_Ubuntu16.04环境下运行vins mono(环境配置及编译)之ROS kinetic的安装...
  7. CA与数字证书的自结
  8. 布林通道参数用20还是26_布林通道(BOLL)策略的投资效果如何?
  9. Suse发生了错误Access denied for user #39;#39;@#39;localhost#39; toamp;
  10. 初探Bootstrap
  11. try catch finally的理解
  12. C# 获取项目程序路径的10种方法
  13. 网站整站下载工具推荐【Z】
  14. 数据流图DFD的画法
  15. 一年之计在于春丨看, 农田里的科技范儿
  16. 经典的开源免费网络游戏:planeshift
  17. java毕业设计——基于java+Spring+JSP的宠物网站设计与实现(毕业论文+程序源码)——宠物网站
  18. html在线编辑器代码运行,JSRun - 在线JS、HTML编辑器(同时也支持各种后台代码的编辑运行)...
  19. 【Matlab电力负荷预测】粒子群优化支持向量机短期电力负荷预测【含GUI源码 751期】
  20. 沈询 java进阶,7细品这杯香浓的咖啡 阿里中间件高级专家沈询的JAVA之旅

热门文章

  1. 【2022最新Java面试宝典】—— 多线程面试(60道含答案)
  2. 技嘉主板更新版BIOS
  3. 国产自主可控智慧会议系统解决方案-移动无纸化会议
  4. 基于javacv的视频转码(升级版)
  5. 视频教程-备战2020毕业季—毕业设计论文实战课程讲解-.NET
  6. TIM无法打开本地文件
  7. FFmpeg结构体分析: AVCodecContext编解码器上下文
  8. Android 仿淘宝首页界面
  9. 服务器装凤凰系统,云服务器安装凤凰os
  10. 浅谈IEEE会议论文的不出席政策Non-Presented Paper(No-Show)Policy