前置知识

GCC & Clang

编译器是翻译代码为计算机语言的一个工具,我们平时写的代码如果想在某个特定的计算机上执行(计算机的cpu构架不同),就需要编译器来对代码进行编译汇编链接,而汇编和链接的过程对于每个不同的平台上过程都不一样。

gccclang是两个编译器,用于将高级编程语言,编译汇编链接成机器语言。

  • GCCGNU Compiler Collection,也称GNU编译器套件,可编译许多种语言(C/C++, Java等)
    • gccGUN C Compiler)是GCC中的c编译器
    • g++GUN C++ Compiler)是GCC中的c++编译器。(两者都可以编译c和cpp文件,但存在差异)
  • Clang → 一个支持编译C/C++/Objective-C语言的轻量级编译器。

make & cmake

makecmake是搭配编译器来方便用户进行多文件编译而发明的工具。IDE的编译功能就包括实现了这些操作。

  • make → 相当于一个智能的批处理工具,本身没有编译和链接的功能,而是用类似于批处理的方式通过调用Makefile文件中用户指定的命令来进行编译和链接。
  • cmake → 用于更方便地生成makefile文件给make用,cmake还可以跨平台生成对应平台能用的makefile
  • CMakeLists.txtcmake根据CMakeLists.txt文件(组态档)去生成makefile;我们使用IDE时,会自动生成各种CMakeLists.txt

编译器编译流程

gcc/g++ 在执行编译工作时,需:

  1. 预处理,生成 .i 的文件 [ 预处理器cpp ]
  2. 将预处理后的文件转换成汇编语言, 生成文件 .s [ 编译器egcs ]
  3. 由汇编变为机器码,生成 .o 的文件 [ 汇编器as ]
  4. 链接目标代码, 生成可执行程序 [ 链接器ld ]

gcc使用

1
语法:gcc [选项]... [参数]...

选项(常用):

1
2
3
4
5
6
7
-o      指定生成的输出文件
-S 将C代码转换为汇编代码
-Wall 显示警告信息
-c 仅执行编译操作,不进行链接操作
-M 列出依赖
-include filename 编译时用来包含头文件,功能相当于在代码中使用#include<filename>
-Ipath 编译时指定头文件目录,使用标准库时不需要指定目录,-I参数可以用相对路径,比如头文件在当前目录,可以用-I.来指定

参数:

1
C源文件:指定C语言源代码文件

使用实例

  1. 如果想要同时编译多个文件,可以直接用-o选项将多个文件进行编译连接:
1
gcc testfun.c test.c -o test

也可以先使用-c选项将每个文件单独编译成.o文件,再用-o选项将多个.o文件进行连接:

1
gcc -c testfun.c -> gcc -c test.c -> gcc testfun.o test.o -o test
  1. 其他操作
1
2
3
$ gcc test.c
#默认生成名为a.out的可执行文件
#Windows平台为a.exe
1
2
$ gcc test.c -o test
#使用-o选项生成名为test的可执行文件

Makefile