工具链 链接到标题
- 编译器:gcc
- 辅助工具:binutils
- 调试器:gdb
- 项目制作:make、cmake。ninja
- 版本控制:git
编译器GCC 链接到标题
可编译语言 链接到标题
多种高级语言:
- C类:C、C++、C#、Object C
- Java类:Java、Ada
- 汇编语言:ASM、FORTRAN、Pascal
包括的工具 链接到标题
- cpp:预处理器
- gcc:编译器
- g++:C++编译器
- gcj:Java编译器
- gnat:Ada编译器
编译运行过程 链接到标题
- 预处理:将
.c
和.h
文件中的宏命令展开 - 编译:将预处理后的文件转换为汇编语言
- 汇编(生成目标文件):将汇编语言转换为机器语言(目标代码)
- 链接:将目标代码和库文件进行静态或者动态链接
如果用命令行来说话的话:
gcc -E hello.i hello.c
gcc -S hello.i -o hello.s
gcc -c hello.s -o hello.o
gcc -o hello.o -o hello
远程调试gdbserver 链接到标题
ssh
IDE 链接到标题
vscode是真神,keil是嵌入式真神。
Makefile 链接到标题
用途 链接到标题
- 很简单的理解就是类似于git里面的gitignore,也就是有些我要编译,有些已经编译过没有改变的就不编译了。从而可以节省时间。
- 另一方面的,也有一种批处理的意味。
所以,其实
gcc -o test test.c
就是一个makefile文件了(不过就一句话没有批处理功能)
规则 链接到标题
相当于是一个思路,是写起其代码的逻辑
- 要创建的 目标
- 要创建目标文件所依赖的 依赖文件
- 通过依赖文件创建目标文件的 命令
其中第三条有一点抽象,不急,来看代码
语法 链接到标题
有多棵树,树的根节点是Makefile,叶子节点是文件,这些文件表示tagert依赖的文件。
target: dependency1 dependency2 ... dependencyN
command1
command2
...
其中target是目标文件,dependency是依赖文件,command是编译命令。
一些技巧 链接到标题
CC = gcc
CFLAGS = -Wall -g
main: main.o utils.o
$(CC) $(CFLAGS) -o main main.o utils.o
main.o: main.c
$(CC) $(CFLAGS) -c main.c
utils.o: utils.c
$(CC) $(CFLAGS) -c utils.c
%.o: %.c
gcc -c $< -o $@
main: main.o utils.o
gcc -o main main.o utils.o
# 只需写出目标和依赖,命令可省略,make会自动推断
main: main.o utils.o
gcc -o main main.o utils.o
main.o: main.c
utils.o: utils.c