Makefile
目录
备忘
- Makefile官方教程(英文)
- 一个makefile教程网址
- 一步编译链接
gcc -o hello hello.c
或者 gcc hello.c -o hello
. (理解了getopts就明白为什么可以这么写)。 这里的一步编译链接等价于后续的-c -o两个步骤,即gcc -c hello.c
和 gcc -o hello hello.o
(或者写成 gcc hello.o -o hello也可以), 推荐使用高亮的一步编译或两步编译命令
我们用gcc编译程序时,可能会用到“-I”(大写i),“-L”(大写l),“-l”(小写l)等参数,下面做个记录:例:
gcc -o hello hello.c -I /home/hello/include -L /home/hello/lib -lworld
上面这句表示在编译hello.c时:
-I /home/hello/include表示将/home/hello/include目录作为第一个寻找头文件的目录,寻找的顺序是:/home/hello/include-->/usr/include-->/usr/local/include
-L /home/hello/lib表示将/home/hello/lib目录作为第一个寻找库文件的目录,寻找的顺序是:/home/hello/lib-->/lib-->/usr/lib-->/usr/local/lib
-lworld表示在上面的lib的路径中寻找libworld.so动态库文件或libworld.a静态库文件(如果两者都有,则链接器会优先链接动态库, 如果gcc编译选项中加入了“-static”表只寻找libworld.a静态库文件)
- makefile例子 见
mk_example.mk
Makefile基础
TARGETS : PREREQUISITES
【TAB】 COMMAND
... # 在执行TRAGETS后面的COMMAND之前必须提前构建依赖项PREREQUISITES
Makefile中的命令
- 必须要以[Tab]键开始,如上一条例子中的
cc -c kbd. c
就必须以Tab键开头
- 如果make执行的命令前面加了@字符,则不显示命令本身而只显示它的结果
- 通常make执行的命令如果出错(该命令的退出状态非0)就立刻终止,不再执行后续命令,但如果命令前面加了
-
号,即使这条命令出错,make也会继续执行后续命令
- 在 Makefile 中书写在同一行中的多个命令属于一个完整的 shell 命令行,书写在独立行的一条命令是一个独立的 shell 命令行。因此:在一个规则的命令中,命令行“ cd”改变目录不会对其后的命令的执行产生影响。就是说其后的命令执行的工作目录不会是之前使用“cd”进入的那个目录。如果要实现这个目的, 就不能把“cd”和其后的命令放在两行来书写。而应该把这两条命令写在一行上,用分号分隔。这样它们才是一个完整的 shell 命令行
- make的命令行选项
- -k: 它的作用是让make命令在发现错误时仍然继续执行, 而不是在检测到第一个错误时就停下来。 你可以利用这个选项在一次操作中发现所有未编译成功的源文件。
- -n: 它的作用是让make命令输出将