前置知识
GCC & Clang
编译器是翻译代码为计算机语言的一个工具,我们平时写的代码如果想在某个特定的计算机上执行(计算机的cpu
构架不同),就需要编译器来对代码进行编译汇编链接,而汇编和链接的过程对于每个不同的平台上过程都不一样。
gcc
、clang
是两个编译器,用于将高级编程语言,编译汇编链接成机器语言。
GCC
→ GNU Compiler Collection
,也称GNU编译器套件,可编译许多种语言(C/C++
, Java
等)
gcc
(GUN C Compiler
)是GCC中的c编译器
g++
(GUN C++ Compiler
)是GCC中的c++编译器。(两者都可以编译c和cpp文件,但存在差异)
Clang
→ 一个支持编译C/C++/Objective-C
语言的轻量级编译器。
make & cmake
make
和cmake
是搭配编译器来方便用户进行多文件编译而发明的工具。IDE
的编译功能就包括实现了这些操作。
make
→ 相当于一个智能的批处理工具,本身没有编译和链接的功能,而是用类似于批处理的方式通过调用Makefile
文件中用户指定的命令来进行编译和链接。
cmake
→ 用于更方便地生成makefile
文件给make
用,cmake
还可以跨平台生成对应平台能用的makefile
。
CMakeLists.txt
→ cmake
根据CMakeLists.txt
文件(组态档)去生成makefile
;我们使用IDE时,会自动生成各种CMakeLists.txt
。
编译器编译流程
gcc/g++
在执行编译工作时,需:
- 预处理,生成
.i
的文件 [ 预处理器cpp
]
- 将预处理后的文件转换成汇编语言, 生成文件
.s
[ 编译器egcs
]
- 由汇编变为机器码,生成
.o
的文件 [ 汇编器as
]
- 链接目标代码, 生成可执行程序 [ 链接器
ld
]
gcc使用
选项(常用):
1 2 3 4 5 6 7
| -o 指定生成的输出文件 -S 将C代码转换为汇编代码 -Wall 显示警告信息 -c 仅执行编译操作,不进行链接操作 -M 列出依赖 -include filename 编译时用来包含头文件,功能相当于在代码中使用#include<filename> -Ipath 编译时指定头文件目录,使用标准库时不需要指定目录,-I参数可以用相对路径,比如头文件在当前目录,可以用-I.来指定
|
参数:
使用实例
- 如果想要同时编译多个文件,可以直接用
-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 2 3
| $ gcc test.c #默认生成名为a.out的可执行文件 #Windows平台为a.exe
|
1 2
| $ gcc test.c -o test #使用-o选项生成名为test的可执行文件
|
Makefile