1. 基本语法
target ... : prerequisites ...
command
...
target 可以是一个object file(目标文件),也可以是一个执行文件,还可以是一个标签(label)。对 于标签这种特性,在后续的“伪目标”章节中会有叙述。
prerequisites 生成该target所依赖的文件和/或target
command 该target要执行的命令(任意的shell命令)
2. Make是如何工作的
在默认的方式下,也就是我们只输入 make 命令。那么,
- make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
- 如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“edit”这个 文件,并把这个文件作为最终的目标文件。
- 如果edit文件不存在,或是edit所依赖的后面的 .o 文件的文件修改时间要比 edit 这个 文件新,那么,他就会执行后面所定义的命令来生成 edit 这个文件。
- 如果 edit 所依赖的 .o 文件也不存在,那么make会在当前文件中找目标为 .o 文件 的依赖性,如果找到则再根据那一个规则生成 .o 文件。(这有点像一个堆栈的过程)
- 当然,你的C文件和H文件是存在的啦,于是make会生成 .o 文件,然后再用 .o 文件生 成make的终极任务,也就是执行文件 edit 了。
3. Makefile选项CFLAGS,LDFLAGS,LIBS
标签 | 含义 | |
---|---|---|
CFLAGSl | 表示用于 C 编译器的选项 | 指定头文件(.h文件)的路径。如:CFLAGS=-I dir |
CXXFLAGS | 表示用于 C++ 编译器的选项 | |
LDFLAGS | 可以在里面指定库文件的位置 | LDFLAGS=-Ldir1 -Ldir2 |
LIBS | 告诉链接器要链接哪些库文件 | LIBS = -lpthread -liconv |
gcc编译器 CFLAGS 标志参数说明
后缀名 | 所对应的语言 |
---|---|
-S | 只是编译不汇编,生成汇编代码 |
-E | 只进行预编译,不做其他处理 |
-g | 在可执行程序中包含标准调试信息 |
-o file | 把输出文件输出到file里 |
-v | 打印出编译器内部编译各过程的命令行信息和编译器的版本 |
-I dir | 在头文件的搜索路径列表中添加dir目录 |
-L dir | 在库文件的搜索路径列表中添加dir目录 |
-static | 链接静态库 |
-llibrary | 连接名为library的库文件 |
4. 在makefile中设置环境变量
不知道 : )
好吧,搜索了很久,没找到可行的方法,先挖个坑。
因为程序中用到了getenv函数,所以固执地不用macro variable。
目前的方法是手动修改
如 $ export TMPFILE = tmp.txt
5.最简单的makefile
假设我只有一个main.c文件
test: main.o
gcc -o test main.o
main.o: main.c
gcc -c main.c
clean:
rm main.o test
网友评论