【MakeFile】最最最基础的命令
基本功能
格式:
1 | 目标文件名: 依赖列表 |
直接上代码解释
1 | main:main.o test1.o test2.o |
要生成的最终目标叫main
【可以是其它名字】;生成main
需要main.o test1.o test2.o这三个依赖
-
则需要写到第一行:
main: main.o test1.o test2.o
-
编译命令写到第二行:gcc main.o test1.o test2.o -o
main
其中-o
表示输出
因为main.o test1.o test2.o这三个依赖已经编译过了,不需要-c
生成中间文件如main.o
,需要main.c xxoo.h 这两个依赖
-
则需要写到第一行:
main.o:main.c xxoo.h
-
编译命令:gcc -c main.c -o
main.o
-c表示编译,对main.c进行编译
-o表示输出,输出到main.o。如果不指定输出名字,会保存到a.o
这个文件
有时候,如果生成依赖文件需要经常变化,就直接赋值给个变量,如OBJ=main.o test.o test1.o test2.o。以此方便增添或删除依赖文件
赋值时,不需要加$符号;
调用时,需要加$()符号;【参考shell编程】
1 | OBJ=main.o test.o test1.o test2.o |
有时候,如果需要调用不同的gcc/g++编译器,一个个的替换很麻烦,也可以赋值给个变量,如CC=gcc
1 | CC=gcc |
自动化变量
自动化变量 | 说明 |
---|---|
$@ | 表示规则的目标文件名。如果目标是一个文档文件(Linux 中,一般成 .a 文件为文档文件,也成为静态的库文件), 那么它代表这个文档的文件名。在多目标模式规则中,它代表的是触发规则被执行的文件名。 |
$% | 当目标文件是一个静态库文件时,代表静态库的一个成员名。 |
$< | 规则的第一个依赖的文件名。如果是一个目标文件使用隐含的规则来重建,则它代表由隐含规则加入的第一个依赖文件。 |
$? | 所有比目标文件更新的依赖文件列表,空格分隔。如果目标文件时静态库文件,代表的是库文件(.o 文件)。 |
$^ | 代表的是所有依赖文件列表,使用空格分隔。如果目标是静态库文件,它所代表的只能是所有的库成员(.o 文件)名。 一个文件可重复的出现在目标的依赖中,变量“$^”只记录它的第一次引用的情况。就是说变量“$^”会去掉重复的依赖文件。 |
$+ | 类似“$^”,但是它保留了依赖文件中重复出现的文件。主要用在程序链接时库的交叉引用场合。 |
$* | 在模式规则和静态模式规则中,代表“茎”。“茎”是目标模式中“%”所代表的部分(当文件名中存在目录时, |
举例
1 | main:main.o test1.o test2.o |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 lthero!
评论