MakeFile笔记

gcc/g++

image-20230322213727869

1
2
3
4
5
gcc -E hello.c -o hello.i
gcc -S hello.i -o jello.s / gcc -S hello.c -o hello.s
gcc -c hello.s -o hello.o / gcc -c hello.c -o hello.o
gcc hello.o -o hello / gcc hello.c -o hello # 动态连接
gcc hello.o hello_static --static / gcc hello.c hello_static --static # 静态连接

Linux下生成的 .o目标文件、.so动态库文件以及下一小节链接阶段生成最终的可执行文件都是elf格式的, 可以使用readelf工具来查看它们的内容。

1
readelf -a hello.o

在Ubuntu下,可以使用 ldd 工具查看动态文件的库依赖

1
ldd hello

预定义变量

$*   不包含扩展名的目标文件名称。 指代匹配符 % 匹配的部分, 比如% 匹配 f1.txt 中的f1 ,$* 就表示 f1

$@   目标的完整名称。

$% 如果目标是归档成员,则该变量表示目标的归档成员名称。

$<   第一个依赖文件的名称。

$+   所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件。

$^   所有的依赖文件,以空格分开,不包含重复的依赖文件。

$?   所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标的创建日期晚。

$(@D) 和 $(@F) 分别指向 $@ 的目录名和文件名

1
2
3
4
VARIABLE = value  # 在执行时扩展,允许递归扩展。
VARIABLE := value # 在定义时扩展。
VARIABLE ?= value # 只有在该变量为空时才设置值。
VARIABLE += value # 将值追加到变量的尾端。

Makefile注意事项

  1. tab分隔,不能用空格。

  2. 每个makefile最好加一个all

  3. 注释用“#”符号

  4. 文件指示,引用其他的makefile文件