文档章节

Xcode中的 编译过程以及编译器

 水一样的人儿
发布于 2016/11/14 16:49
字数 1297
阅读 10
收藏 0
点赞 0
评论 0

一。

在Xcode里写C语言函数的编译过程

1.编译,连接,运行 

编译

1.什么是编译:将C源程序翻译成计算机能识别的0和1

2.使用什么编译器:3之前用GCC,Xcode4之后使用LLVM编译器(前端clang)

 在终端输入:CC -c 文件名.c (cd 进入当前目录下)

编译成功,会生成.o目标文件

3.编译器的错误和警告功能:

 如果代码有语法问题,编译器会直接报错

只要有一个错误❌,程序就不能编译成功,也不好生成.o文件

警告⚠️只是编译的一些建议,并不影响编译通过。

连接

1.连接的作用:将.o文件和C语言函数库组合在一起。生成可执行文件

2.由连接器完成:clang连接器里面已经包含了连接指令。

终端输入: cc 文件.o

连接成功,会生成a.out可执行文件。

运行

1.两种方式运行

* 直接双击打开a.out文件

* 终端中使用./a.out指令。

2修改文件内容后,一定要重新编译,连接,再运行。

总结

1整个程序的运行过程

编写程序 ->元到吗 -> 编译 -> 目标文件 -> 连接(C语言函数库)-> 可执行的机器代码 -> 运行

2开发中会遇到哪些错误?如何解决?

语法错误,可以通过编译器的报错信息解决

逻辑错误,需要耐心调试程序

3学习建议

学编程不是学英语

程序的可读性

 

二。

参考:// https://segmentfault.com/a/1190000003101087

Xcode中的 编译过程以及编译器

基本的编译过程分为四个步骤:

  1. 预处理(Pre-process):把宏替换,删除注释,展开头文件,产生 .i 文件。

  2. 编译(Compliling):把之前的 .i 文件转换成汇编语言,产生 .s文件。

  3. 汇编(Asembly):把汇编语言文件转换为机器码文件,产生 .o 文件。

  4. 链接(Link):对.o文件中的对于其他的库的引用的地方进行引用,生成最后的可执行文件(同时也包括多个 .o 文件进行 link)。

     

    在 xcode 编译的过程中,大部分的命令都可以自解释,不过仍有个别的命令直接看是看不出来干嘛的,这里解释一下:
    ld :用于产生可执行文件。
    libtool:产生 lib 的工具。

接下来就是编译过程的控制,在 xcode 中可以通过 Build phases,Build settings以及 Build rules来进行控制。

Build phases主要是用来控制从源文件到可执行文件的整个过程的,所以应该说是面向源文件的,包括编译哪些文件,以及在编译过程中执行一些自定义的脚本什么的。
Build rules 主要是用来控制如何编译某种类型的源文件的,假如说相对某种类型的原文件进行特定的编译,那么就应该在这里进行编辑了。同时这里也会大量的运用一些 xcode 中的环境变量,完整的官方文档在这里:Build Settings Reference
Build settings则是对编译工作的细节进行设定,在这个窗口里可以看见大量的设置选项,从编译到打包再到代码签名都有,这里要注意 settings 的 section 分类,同时一般通过右侧的 inspector 就可以很好的理解选项的意义了。

最后,要说一下我们的工程文件.pbxproj,以上的所有的这些选项都保存在这个文件中。当然也包括 target 的信息,项目所有文件的信息,这个文件是一个文本文件,可以用文本编辑器打开。里头的内容基本是可读性比较强的。基本的思路很面向对象,每个东西都有属性,如果属性是另一个对象,值就是那个对象的一个『引用』,就是一串数字(唯一的)作为表示。每个对象都有这样的引用。

 

编译器

首先,编译器是做什么的?编译器是用来把源代码文件转换为更为低级的语言的(同时还有语句的静态分析),而 xcode 使用的clang 编译器的作用就是把源代码转换为更为低级的 LLVM IR(Intermedia Representation),这个 LLVM IR 是操作系统无关的,然后 LLVM 通过这个中间语言来进行下一步的二进制文件的产出。得益于 LLVM 的三层架构,LLVM 可以有多个输入和输出(LLVM 的第一层架构是用于处理输入的,第二层用于优化 IR ,第三层用于输出)这里遇到了一个问题,不了解到底 clang 和 LLVM 之间的关系是什么,估计得明白编译器是怎么做的才能明白。

 

三。

很详细,有需要时可以参考http://https://objccn.io/issue-6-1/

 

四。

GCC编译的四大过程

预处理(Pre-processing)

编译阶段(Compiling)

汇编阶段(Assembling)

链接阶段(Link)

 

© 著作权归作者所有

共有 人打赏支持
粉丝 8
博文 158
码字总数 76243
作品 0
杭州
Mac OS X 10.8.2 如何安装Xcode 4.5.2以及Qt 5.0

最近刚入手一台Macbook Pro,对苹果系统还不熟悉。 OS X版本是10.8.2,我下载了Xcode 4.5.2和Qt 5的dmg安装文件。 安装Xcode的过程是这样的:双击dmg文件后,把Xcode的图标拖到了应用程序里就...

Jian-Yong
2013/01/07
10.7K
6
OC语言的特性(一)-消息传递与调用函数的表现形式

我们在初学Objective-C时,都会觉得ObjC中的消息传递和其他语言的调用函数差不多,只是在OC中,方法调用用消息传递这一概念来代替。 那么到底怎样区别OC中的消息传递与其他语言的调用函数呢。...

浩浩老师
2015/09/08
1K
0
iOS底层探索(一) - 从零开始认识Clang与LLVM

写在前面: 本系列为 『iOS底层探索系列』第一篇,本文源自本人的学习记录整理与理解,其中参考阅读了部分优秀的博客和书籍,尽量以通俗简单的语句转述。引用到的地方如有遗漏或未能一一列举...

Developer_CYX
2017/12/20
0
0
iOS深入学习:构建阶段、编译器错误和连接器错误

我建了一个iOS开发QQ交流群:188647173,大家可以一起来相互学习。 还有一个群里面大神的个人站点www.mylonly.com,大家有不会的可以向他请教。 Xcode会分步骤构建应用,这些步骤成为构建阶段...

召唤攻城狮
2014/04/15
0
0
GCC,LLVM,Clang编译器对比

在XCode中,我们经常会看到这些编译选项(如下图),有些人可能会有些茫然,本文将对GCC4.2、LLVM GCC 4.2、LLVM compliler 2.0三个编译选项进行一个详细的介绍。 GCC GCC(GNU Compiler Co...

u013702462
05/10
0
0
细谈xcode集成开发环境----我的笔记

第一次接触苹果手机是在我的同学家里,他用的iPhone 5,不过现在苹果手机已经升级iPhone 6啦。 他说,苹果手机就是不一样,就是任性。 Mac操作系统 聊天用aim,类似于国内QQ,图片设计用iPhot...

crossmix
2015/12/29
85
0
compiler LLVM(zhuanzai)

Mac OS X 10.6即所谓的Snow Leopard操作系统已正式发售。一如既往,Apple产品光鲜的外表下凝聚了太多艰辛的劳作。ArsTechnic的John Siracusa以其独特的、专业的、全面的视角深入翔实地体验这...

孙启超
2012/12/18
0
0
WWDC 2013 Session笔记 - Xcode5和ObjC新特性

这是我的WWDC2013系列笔记中的一篇,完整的笔记列表请参看这篇总览。本文仅作为个人记录使用,也欢迎在许可协议范围内转载或使用,但是还烦请保留原文链接,谢谢您的理解合作。如果您觉得本站...

木木情深
2014/02/19
0
0
关于C++和Objective-C混编

Objective-C在大部分情况下足够满足我们的需求,但是还是会有一些情况必须要使用C++,比如: 使用C++的库 当Objective-C不够快的时候 第一点自然不必多说,至于第二点,Objective-C的消息机制...

JohnZr
2012/08/19
0
0
iOS中的预编译指令的初步探究

目录   文件包含     #include     #includenext     #import   宏定义     #define     #undef   条件编译     #if #else #endif     #if define #ifdef...

北方人在上海
2016/09/12
12
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

gRPC学习笔记

gRPC编程流程 1. proto文件定义 proto文件用于定义需要通过gRPC生成的接口,可以理解为接口定义文档 2. 通过构建工具生成服务基类代码-Maven或Gradle 3. 服务端开发 服务端实现类须实现通过构...

OSC_fly
19分钟前
0
0
Docker Mac (三) Dockerfile 及命令

Dockerfile 最近学习docker的时候,遇到一件怪事,关于docker镜像可能会被破坏,还不知道它会有此措施 所以需要了解构建Dockerfile的正确方法 Dockerfile是由一系列命令和参数构成的脚本,这些命...

___大侠
46分钟前
0
0
NetCat Tutorials

Hacking with Netcat part 1: The Basics Hacking with Netcat part 2: Bind and reverse shells Hacking with Netcat part 3: Advanced Techniques 10 Introduction to Netcat - pdf NetCat......

zungyiu
46分钟前
0
0
Android Studio+NDK+Cmake 移植FFmpeg-4.0.2命令行工具

一、编译 参考大神的帖子,亲测一次编译成功:https://blog.csdn.net/bobcat_kay/article/details/80889398 鉴于以前查文档的经验,这里附上编写例子的时间:2018年7月22日 我用的是ubantu,...

她叫我小渝
46分钟前
0
0
mysql创建数据库

登录MYSQL mysql -u root -p 脚本创建数据库WeChat,并制定默认的字符集是utf8mb4。 CREATE DATABASE Wechat DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci; 授权 grant all......

niithub
今天
0
0
svn: Unable to connect to a repository URL 的解决方案

错误图示: 解决办法:清除本地保存的授权信息; 1:右键点击本地文件夹,选择设置; TortoiseSVN -> Settings 2:在弹出的对话框中选择 Saved Data, 右侧选择:授权地方清理所有。 然后点确...

宁哥实战课堂
今天
1
0
sleep与wait的区别

Thread.sleep(XXX)方法消耗CPU吗? 这个知识点是我之前认识一直有错误的一个知识点,在我以前的认识里面,我一直认为Thread.sleep(1000)的这一秒钟的时间内,线程的休眠是一直占用着CPU的时间...

码代码的小司机
今天
1
0
20位活跃在Github上的国内技术大牛 leij 何小鹏 亚信

本文列举了20位在Github上非常活跃的国内大牛,看看其中是不是很多熟悉的面孔? 1. lifesinger(玉伯) Github主页: https://github.com/lifesinger 微博:@ 玉伯也叫射雕 玉伯(王保平),...

海博1600
今天
1
0
Mybatis收集配置

一、Mybatis取Clob数据 1、Mapper.xml配置 <resultMap type="com.test.User" id="user"> <result column="id" property="id"/> <result column="json_data" property="jsonData" ......

星痕2018
今天
1
0
centos7设置以多用户模式启动

1、旧版本linux系统修改inittab文件,在新版本执行vi /etc/inittab 会有以下提示 # inittab is no longer used when using systemd. # # ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON......

haha360
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部