Linux命令是对Linux系统进行管理的命令。对于Linux系统来说,无论是中央处理器、内存、磁盘驱动器、键盘、鼠标,还是用户等都是文件,Linux系统管理的命令是它正常运行的核心,与之前的DOS命令类似。linux命令在系统中有两种类型:内置Shell命令和Linux命令。本文主要介绍Linux make 命令。

 1、命令简介

make:在Linux系统中常用的构建工具,用于自动化编译和构建项目。它通常用于编译源代码文件,将它们转换成可执行文件、库文件或其他需要的形式。

2、命令语法

make [ -f makefile ] [ options ] ... [ targets ] ... 

3、命令描述

make工具的目的是自动确定需要重新编译大型程序的哪些部分,并发出重新编译它们的命令。可以在任何可以通过shell命令运行编译器的编程语言中使用make。事实上,make并不仅限于程序。可以使用它来描述任何任务,在这些任务中,一些文件在其他文件更改时必须自动更新。

为了准备使用make,必须编写一个名为makefile的文件,该文件描述了程序中文件之间的关系,并说明了更新每个文件的命令。在一个程序中,通常可执行文件是从目标文件更新的,而目标文件又是通过编译源文件生成的。

4、命令选项

选项

描述

-b, -m

打印在线帮助并退出。这些选项被忽略,

仅为了与其他版本的 make 兼容。

-B, --always-make

无条件地构建所有目标。

-C dir, --directory=dir

在读取 makefile 或执行其他操作之前,

切换到目录 dir。如果指定了多个 -C 选项,

每个选项都相对于前一个选项进行解释:

-C / -C 等相当于 -C /etc

这通常与递归调用 make 一起使用。

-d

除了正常处理外,还打印调试信息。

调试信息显示哪些文件正在考虑重新生成,

正在比较哪些文件时间以及结果如何,

哪些文件实际上需要重新生成,

哪些隐含规则正在考虑和应用

——关于 make 如何决定做什么的所有有趣信息。

--debug[=FLAGS]

除了正常处理外,还打印调试信息。

如果省略 FLAGS,则行为与指定 -d 时相同。

FLAGS 可以是 a(所有调试输出,与使用 -d 相同),

b(基本调试)、v(更详细的基本调试)、

i(显示隐含规则)、j(命令调用的详细信息)

和 m(重新生成 makefile 时的调试)。

-e,--environment-overrides

环境中的变量优先于 makefile 中的变量。

-f file, --file=file, --makefile=FILE

将文件用作 makefile。

-i, --ignore-errors

忽略执行重新生成文件的所有错误。

-I dir, --include-dir=dir

指定目录 dir 以搜索包含的 makefile。

如果使用多个 -I 选项来指定多个目录,

则按指定的顺序搜索这些目录。与 make 的其他标志不同,

使用 -I 标志给出的目录可以直接跟在标志后面:

允许 -Idir,以及 -I dir

此语法与 C 预处理器的 -I 标志兼容。

-j [jobs], --jobs[=jobs]

指定同时运行的作业(命令)数。如果有多个 -j 选项,

则最后一个有效。如果没有参数给出 -j 选项,

则 make 不会限制可以同时运行的作业数。

-k, --keep-going

在出现错误后尽量继续。尽管无法重新生成失败的目标及其依赖项,

但这些目标的其他依赖项仍然可以全部处理。

-l [load], --load-average[=load]

指定如果有其他作业正在运行且平均负载至少为 load(浮点数),

则不启动新作业(命令)。如果没有参数,

将删除先前的负载限制。

-L, --check-symlink-times

使用符号链接和目标之间的最新 mtime。

-n, --just-print, --dry-run, --recon

打印将要执行的命令,但不执行它们。

-o file, --old-file=file, --assume-old=file

即使文件 file 的时间戳比其依赖项旧,

也不重新生成该文件,

并且不因文件的更改而重新生成任何内容。

实际上,该文件被视为非常旧,其规则被忽略。

-p, --print-data-base

打印从读取 makefile 得到的数据库(规则和变量值);

然后像通常一样或如其他指定的那样执行。

这还会打印由 -v 开关给出的版本信息。

-q, --question

'问题模式'。不运行任何命令,

也不打印任何内容;只返回一个退出状态,

如果指定的目标已经是最新的,则返回零,

否则返回非零。

-r, --no-builtin-rules

消除内置的隐含规则的使用。

还清除后缀规则的默认后缀列表。

-R, --no-builtin-variables

不定义任何内置变量。

-s, --silent, --quiet

静默操作;不打印正在执行的命令。

-S, --no-keep-going, --stop

取消 -k 选项的效果。这只在递归调用 make 时才需要,

可能通过 MAKEFLAGS 从顶级 make 继承 -k

或者在环境中设置 -k

-t, --touch

触摸文件(标记它们为最新,而不实际更改它们),

而不是运行它们的命令。这用于假装已经执行了命令,以欺骗将来的 make 调用。

-v, --version

打印 make 程序的版本以及版权、作者列表和无担保声明。

-w, --print-directory

在其他处理之前和之后打印包含工作目录的消息。

这可能对于跟踪复杂的递归 make 命令嵌套中的错误很有用。

--no-print-directory

关闭 -w,即使它被隐式打开。

-W file, --what-if=file, --new-file=file, --assume-new=file

假装目标文件刚刚被修改。当与-n 标志一起使用时,

这会显示如果您修改了该文件会发生什么

。如果没有 -n,它与在运行 make 前在给定文件上运行 touch 命令几乎相同,

只是修改时间仅在 make 的想象中改变。

--warn-undefined-variables

在引用未定义的变量时发出警告。

5、使用示例

1)编译程序

$ make
 gcc -c -Wall test1.c
 gcc -c -Wall test2.c
 gcc -Wall test1.o test2.o -o test 

注意:make读取当前目录中的makefile,并根据makefile中的语句执行

2)清理所有的目标文件

 make clean
 rm -rf *.o test

3)要强制生成所有程序,可以使用-B选项

$ make -B
 gcc -c -Wall test.c
 gcc -c -Wall anotherTest.c
 gcc -Wall test.o anotherTest.o -o test

4)要在调试模式下运行make,使用-d选项

$ make -d

Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
This program built for x86_64-pc-linux-gnu

Reading makefiles...
Reading makefile `Makefile'...
Updating makefiles....
Considering target file `Makefile'.
Looking for an implicit rule for `Makefile'.
Trying pattern rule with stem `Makefile'.
Trying implicit prerequisite `Makefile.o'.
Trying pattern rule with stem `Makefile'.
Trying implicit prerequisite `Makefile.c'.
Trying pattern rule with stem `Makefile'.
Trying implicit prerequisite `Makefile.cc'.
Trying pattern rule with stem `Makefile'.
Trying implicit prerequisite `Makefile.C'.
Trying pattern rule with stem `Makefile'.
Trying implicit prerequisite `Makefile.cpp'.
Trying pattern rule with stem `Makefile'.
--More--

5)编译的项目在不同的目录

$ make -C /home/testdir/
make: Entering directory `/home/himanshu/practice/make-dir'
make: Nothing to be done for `all'.
make: Leaving directory `/home/himanshu/practice/make-dir'

6)要使用其他文件而不是默认的makefile,使用-f选项

$ make -f my_makefile
gcc -c -Wall test1.c
gcc -c -Wall test2.c
gcc -Wall test1.o test2.o -o test 

推荐文档