什么是gcc
Linux环境下的一个C/C++编译器
编译过程
- 预处理:展开宏定义;处理库文件;处理条件编译;删除注释等
gcc -E source.c -o rename.i
(一般使用的命令)
gcc -E -C source.c -o rename.i
(加入选项-C,阻止删除注释)
gcc -E source.c -o rename.i -D CONVERT
(选项-D可加入宏定义,搭配 ifdef 可实现调试等功能)
预处理后的文件是可显示的文本文件 - 编译:高级语言–>汇编语言
gcc -S source.c(.i) -o rename.s
C编译器在具体的翻译之前,会先对源程序进行词法分析、语法分析、语义分析,根据分析的结果进行代码优化、储存分配 - 汇编:汇编语言–>机器语言
gcc -c source.c(.s) -o rename.o
把汇编生成的机器语言目标代码文件称为可重定位目标文件 - 链接:生成可执行文件
gcc source.c(.o) -o rename
在链接阶段加入参数-l、-L、-I
可以链接需要用到的库文件、头文件
- 参数
-l
: 指定要链接的库,比如要链接数学库,则加入参数-lm
,因为数学库文件的全名是libm.so
,去掉前缀lib
和后缀.so
就是库名m
,其他库同理。- 参数
-L
:在/lib
和/usr/lib
和/usr/local/lib
三个目录下的库文件可以直接使用-l
命令连接,对于其他的库文件,需要用-L
去指定所在目录,如:-L/xx/yy -lhello
这个命令可以链接位于/xx/yy目录下的libhello.so库- 参数
-I
: 指定头文件所在目录,适用于源文件和头文件不在同一个目录下
注:上面用到的 -S、-c 等命令不仅仅能表示单个过程,如果使用命令:gcc -c source.c -o rename.o
表示的是预处理、编译、汇编,但不链接,生成 .o 文件。
多文件编译
适用于含有自己编写的头文件等情况
- 如果结构比较简单,直接编译即可:
gcc source1.c source2.c -o prog
(也可以使用通配符*.c) - 为了免去修改一个文件都要重新编译所有文件的消耗,可以分别将每一个 .c 源文件用 -c命令 编译为.o文件,最后再进行链接
- 编写makefile文件
编写Makefile
通过编写Makefile文件规定编译的过程和规则
- 基本格式:
target1:requires
command1
target2:requires
command2
......
operator:
command
target是要生成的目标文件,requires是生成target所需的依赖文件。第一个target是最终的目标文件。operator是自定义的操作,常见的是clean命令,用于清理中间文件。
clean:
rm *.o *.s
- 通过make命令调用Makefile文件,
make + 命令
调用自定义的命令