Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

5. 常用的 make 命令行选项

-n 选项只打印要执行的命令,而不会真的执行命令,这个选项有助于我们检查 Makefile 写得是否正确,由于 Makefile 不是顺序执行的,用这个选项可以先看看命令的执行顺序,确认无误了再真正执行命令。

-C 选项可以切换到另一个目录执行那个目录下的 Makefile,比如先退到上一级目录再执行我们的 Makefile(假设我们的源代码都放在testmake 目录下):

$ cd ..
$ make -C testmake
make: Entering directory `/home/akaedu/testmake'
cc    -c -o main.o main.c
cc    -c -o stack.o stack.c
cc    -c -o maze.o maze.c
gcc main.o stack.o maze.o -o main
make: Leaving directory `/home/akaedu/testmake'

一些规模较大的项目会把不同的模块或子系统的源代码放在不同的子目录中,然后在每个子目录下都写一个该目录的 Makefile,然后在一个总的 Makefile 中用 make -C 命令执行每个子目录下的 Makefile。例如 Linux 内核源代码根目录下有 Makefile ,子目录 fsnet 等也有各自的 Makefile ,二级子目录 fs/ramfsnet/ipv4 等也有各自的 Makefile

make 命令行也可以用 =:= 定义变量,如果这次编译我想加调试选项 -g ,但我不想每次编译都加 -g 选项,可以在命令行定义 CFLAGS 变量,而不必修改 Makefile 编译完了再改回来:

$ make CFLAGS=-g
cc -g   -c -o main.o main.c
cc -g   -c -o stack.o stack.c
cc -g   -c -o maze.o maze.c
gcc main.o stack.o maze.o -o main

如果在 Makefile 中也定义了 CFLAGS 变量,则命令行的值覆盖 Makefile 中的值。