目录

文章目录

  • 目录
  • 文章目录
  • GCC 工具链
    • GCC 编译器
      • GCC 的常用指令选项
      • GCC 所遵循的部分约定规则
    • Binutils
    • C 运行时库
  • Clang 和 LLVM

文章目录

《C 语言编程 — GCC 工具链》
《C 语言编程 — 程序的编译流程》
《C 语言编程 — 静态库、动态库和共享库》
《C 语言编程 — 程序的装载与运行》
《计算机组成原理 — 指令系统》
《C 语言编程 — 结构化程序流的汇编代码与 CPU 指令集》

GCC 工具链

GCC 工具链软件包括 GCC、Binutils、C 运行库等。

GCC 编译器

GCC(GNU Compiler Collection,GNU 编译器套件)是 Linux 下使用最广泛的 C/C++ 编译器。GCC 是以 GPL 许可证所发行的自由软件,也是 GNU 计划的关键部分。GCC 的初衷是为 GNU 操作系统专门编写一款编译器,现已被大多数类 Unix 操作系统,如:Linux、BSD、Mac OS X 等采纳为标准的编译器。GCC 支持多种计算机体系结构芯片,如 x86、ARM、MIPS 等,并已被移植到其他多种硬件平台。

GCC 仅仅是一个编译器,没有界面,必须在命令行模式下使用。通过 gcc 命令就可以将源文件编译成可执行文件。

上述示例通过 gcc 命令一次性完成编译和链接的整个过程,这样最方便。但实际上,gcc 命令也可以将编译和链接分开,每次只完成一项任务:

  1. 编译(Compiler):就将 hello.c 编译为 hello.o,一个源文件只会生成一个目标文件,默认的目标文件名字和源文件名字是一样的。
gcc -c hello.c
  1. 链接(Linker):在 gcc 命令后面紧跟目标文件的名字,就可以将目标文件链接成为可执行文件。
gcc hello.o

GCC 的常用指令选项

  • -c:只编译,不链接成为可执行文件,通常用于编译不包含主程序的子程序文件。
  • -o <output_filename>:确定输出文件的名称,默认为 XXX.out。
  • -g:产生 GDB 符号调试工具所必要的符号信息,要对源代码进行调试,就必须加入这个选项。
  • -O:对程序进行优化编译、链接,采用这个选项,整个源代码会在编译、链接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是编译、链接的速度就相应地要慢一些。
  • -O2:比 -O 更好的优化编译、链接,当然整个编译、链接过程也会更慢。
  • -I <dirname>,将 dirname 指向的目录加入到 C 程序的头文件目录列表中,是在预处理过程中使用的参数。C 程序中的头文件包含两种情况∶
    • #include <myinc.h>:预处理程序 cpp 在系统预设包含文件目录(e.g. /usr/include)中搜寻相应的文件。
    • #include "myinc.h":预处理程序 cpp 在目标文件的文件夹内搜索相应文件。
  • -v:打印 gcc 执行时的详细过程。

GCC 所遵循的部分约定规则

  • .c 文件:C 语言源代码文件;
  • .h 文件:是程序所包含的头文件;
  • .o 文件:是编译后的目标文件;
  • .a 文件:是由目标文件构成的档案库文件;
  • .C、.cc 或 .cxx 文件:是 C++ 源代码文件且必须要经过预处理;
  • .i 文件:是 C 源代码文件且不应该对其执行预处理;
  • .ii 文件:是 C++ 源代码文件且不应该对其执行预处理;
  • .m 文件:是 Objective-C 源代码文件;
  • .mm 文件:是 Objective-C++ 源代码文件;
  • .s 文件:是汇编语言源代码文件;
  • .S 文件:是经过预处理的汇编语言源代码文件。

Binutils

Binutils 一组工具是开发和调试不可缺少的工具,包括:addr2line、ar、objcopy、objdump、as、ld、ldd、readelf、size 等。

  • addr2line:用来将程序地址转换成其所对应的程序源文件及所对应的代码行,也可以得到所对应的函数。该工具将帮助调试器在调试的过程中定位对应的源代码位置。
  • as:主要用于汇编。
  • ld:主要用于链接。
  • ar:主要用于创建静态库。为了便于初学者理解,在此介绍动态库与静态库的概念:
  • ldd:可以用于查看一个可执行程序依赖的共享库。
  • objcopy:将一种对象文件翻译成另一种格式,譬如将 .bin 转换成 .elf、或者将 .elf 转换成 .bin 等。
  • objdump:主要的作用是反汇编。
  • readelf:显示有关 ELF 文件的信息。
  • size:列出可执行文件每个部分的尺寸和总尺寸,代码段、数据段、总大小等。

C 运行时库

C 语言标准主要由两部分组成:一部分描述 C 的语法,另一部分描述 C 标准库。

C 标准库定义了一组标准头文件,每个头文件中包含一些相关的函数、变量、类型声明和宏定义,譬如常见的 printf 函数便是一个 C 标准库函数,其原型定义在 stdio.h 头文件中。

实际上,C 语言标准仅仅定义了 C 标准库函数原型,并没有提供实现。因此,C 语言编译器通常需要一个 C 运行时库(C Run Time Libray,CRT)的支持。与 C 语言类似,C++ 也定义了自己的标准,同时提供相关支持库,称为 C++ 运行时库。

Clang 和 LLVM

GCC 目前作为跨平台编译器来说它的兼容性无异是最强大的,但兼容性肯定是以牺牲一定的性能为基础的。我们知道,在整个编译过程中,以中间代码为界,前面的词法分析、语法分析、语义分析等称之为前端处理,而后面的代码优化和目标代码生成称为后端处理。

GCC 作为兼容性最好的编译器,其为不同的高级语言单独写了一个前端,同时也为不同的处理器架构单独写了一个后端。你可以下载一份 GCC 源代码,通过配置 configure 来生成自己需要的编译器类型。但实际上这件事情并不容易,因为前端的主要功能是产生一个可供后端处理的抽象语法树,而语法树的结构实际上很难与处理器架构脱钩,这些都是编译器应用中需要解决的问题。

苹果为了能够针对自家的 Objective-C 编程语言提高编译性能,因此为 MAC 系统开发了一套专用的编译器软件 Clang 和 LLVM。自 XCode4 之后,苹果的默认编译器已经是 LLVM 了。

  • Clang 作为编译器前端:目的是输出代码对应的抽象语法树(Abstract Syntax Tree, AST),并将代码编译成 LLVM Bit Code。
  • LLVM 作为编译器后端:将 LLVM Bit Code 编译成平台相关(e.g. x86、ARM)的机器语言。

Clang 生成的 AST 所耗用掉的内存仅仅是 GCC 的 20% 左右。测试证明 Clang 编译 Objective-C 代码时,速度为 GCC 的 3 倍,还能针对用户发生的编译错误准确地给出建议。

C 语言编程 — GCC 工具链相关推荐

  1. HC32L110(三) HC32L110的GCC工具链和VSCode开发环境

    目录 HC32L110(一) HC32L110芯片介绍和Win10下的烧录 HC32L110(二) HC32L110在Ubuntu下的烧录 HC32L110(三) HC32L110的GCC工具链和VS ...

  2. linux使用交叉工具链产生的程序怎么下载到mini2440里,Ubuntu安装ARM架构GCC工具链(ubuntu install ARM toolchain)最简单办法...

    一.安装ARM-Linux-GCC工具链 只需要一句命令: sudo apt-get install gcc-arm-linux-gnueabi 前提是你的Ubuntu系统版本是官网支持的最新的版本, ...

  3. gcc工具链查看默认编译选项

    命令: echo "" | gcc -v -x c++ -E - 如在Ubuntu系统下输出结果为: rambo@ubuntu:/tmp$ echo "" | ...

  4. ubuntu下 gcc工具链的安装

    安装前的准备工作 ubuntu14.04中,一般将自定义的软件安装在/usr/local/目录下: arm s5pv210的工具链为arm_linux_2009q3.版本号为 工具链压缩包见下列网址: ...

  5. C 语言编程 — 结构化程序流的汇编代码与 CPU 指令集

    目录 文章目录 目录 文章目录 为什么要保留汇编语言 顺序程序流 条件程序流 循环程序流 函数调用栈的工作原理 文章目录 <C 语言编程 - GCC 工具链> <C 语言编程 - 程 ...

  6. C 语言编程 — 程序的装载与运行

    目录 文章目录 目录 文章目录 C 程序在操作系统中的装载与运行 ELF 文件 反汇编 ELF 文件 文章目录 <C 语言编程 - GCC 工具链> <C 语言编程 - 程序的编译流 ...

  7. C 语言编程 — 程序的编译流程

    目录 文章目录 目录 文章目录 C 程序的编译流程 预处理 编译 汇编 链接 编译多个源文件 文章目录 <C 语言编程 - GCC 工具链> <C 语言编程 - 程序的编译流程> ...

  8. C 语言编程 — 静态库、动态库和共享库

    目录 文章目录 目录 文章目录 程序函数库 静态链接 创建静态库文件 动态链接 创建共享库文件 共享库文件的名字 共享库文件的存储路径 LD_LIBRARY_PATH 环境变量 ldconfig 指令 ...

  9. 深入理解工具链-自己搭建STM32编程IDE

    目录 一.前言 二.编译器组成与编译流程 2.1 编译流程概述 2.2 Gcc For Arm编译器 2.3 预编译 2.4 编译 2.5 汇编 2.6 链接 2.7 生成HEX镜像 2.8 通过Ma ...

最新文章

  1. 全球及中国手持式无线电台行业十四五发展动态及前景趋势调研报告2022-2027年
  2. 【基础】弹出框的处理(五)
  3. [转载] XStream的分析
  4. 南方cass10.1中文版
  5. java语言特点概述
  6. excel常用控件使用方法一看就懂(干货不糊弄)
  7. 国密SM算法有哪些?
  8. 2020华师大个人考研总结
  9. 少林寺公布武功秘籍 揭开绝技神秘面纱(组图)
  10. 图解TCP/IP 第一章 网络基础知识
  11. excel调用python编程-超简单:用Python让Excel飞起
  12. python带你采集回车桌面高清写真壁纸
  13. 每月一书(202112):《王阳明心学》
  14. 重磅!京东云区块链数据服务(BDS)正式开源
  15. vue中写svg组件svg图片加载不出来
  16. My97 DatePicker普通调用
  17. surf.detectAndCompute()提取keypoint中关键点坐标
  18. Elasticsearch(一)——Es安装(三个必安工具、安装各种类型分词器)、Es 十大核心概念、通过 Kibana 操作 Es(中文分词、Es各种索引命令操作)
  19. ipad服务器未响应怎么办,ipad Air使用上的12个问题及解决方法
  20. 【技术分享】Android应用安全开发之浅谈加密算法的坑

热门文章

  1. delphi 调用php接口_贝壳找房小程序从PHP到Golang的跃迁之路
  2. python获取ftp所有文件名_在Python中获取最新的FTP文件夹名称
  3. 在动作观察,运动想象和站立和坐姿执行过程中解码脑电节律
  4. AutoX江苏超级工厂首曝光!机械臂随处可见,车辆出厂就能完全无人驾驶
  5. vivo不小心把内部自研技术方案写进了“年终总结”,我看了直接好家伙
  6. 博士在读却连矩阵的秩都搞不清,我该如何毕业?|Reddit热议
  7. 国内自动驾驶战局如何?我对比了下华为大疆特斯拉百度等公司
  8. 美国火星车失联的7分钟,高清视频传回来了
  9. 我在上海的AI新地标,看懂了明略的游戏规则
  10. 苹果2项最新专利曝光无人车路线:闭门造车、传感器先行,关注驾乘体验