工具链 链接到标题

  • 编译器: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
一开始听理论有一点抽象,但在上过几节微机实验课之后根据这个流程编了好多个程序之后就非常熟悉了。 然后binutils等工具暂时没有用过,所以也先不讲

远程调试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