1、命令简介
make:在Linux系统中常用的构建工具,用于自动化编译和构建项目。它通常用于编译源代码文件,将它们转换成可执行文件、库文件或其他需要的形式。
2、命令语法
make [ -f makefile ] [ options ] ... [ targets ] ...
3、命令描述
make
工具的目的是自动确定需要重新编译大型程序的哪些部分,并发出重新编译它们的命令。可以在任何可以通过shell命令运行编译器的编程语言中使用make
。事实上,make
并不仅限于程序。可以使用它来描述任何任务,在这些任务中,一些文件在其他文件更改时必须自动更新。
为了准备使用make
,必须编写一个名为makefile
的文件,该文件描述了程序中文件之间的关系,并说明了更新每个文件的命令。在一个程序中,通常可执行文件是从目标文件更新的,而目标文件又是通过编译源文件生成的。
4、命令选项
选项 | 描述 |
-b, -m | 打印在线帮助并退出。这些选项被忽略, 仅为了与其他版本的 |
-B, --always-make | 无条件地构建所有目标。 |
-C dir, --directory=dir | 在读取 切换到目录 每个选项都相对于前一个选项进行解释:
这通常与递归调用 |
-d | 除了正常处理外,还打印调试信息。 调试信息显示哪些文件正在考虑重新生成, 正在比较哪些文件时间以及结果如何, 哪些文件实际上需要重新生成, 哪些隐含规则正在考虑和应用 ——关于 |
--debug[=FLAGS] | 除了正常处理外,还打印调试信息。 如果省略 FLAGS,则行为与指定 FLAGS 可以是 a(所有调试输出,与使用 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。 如果使用多个 则按指定的顺序搜索这些目录。与 make 的其他标志不同, 使用 允许 - 此语法与 C 预处理器的 |
-j [jobs], --jobs[=jobs] | 指定同时运行的作业(命令)数。如果有多个 则最后一个有效。如果没有参数给出 -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 继承 或者在环境中设置 |
-t, --touch | 触摸文件(标记它们为最新,而不实际更改它们), 而不是运行它们的命令。这用于假装已经执行了命令,以欺骗将来的 make 调用。 |
-v, --version | 打印 |
-w, --print-directory | 在其他处理之前和之后打印包含工作目录的消息。 这可能对于跟踪复杂的递归 make 命令嵌套中的错误很有用。 |
--no-print-directory | 关闭 -w,即使它被隐式打开。 |
-W file, --what-if=file, --new-file=file, --assume-new=file | 假装目标文件刚刚被修改。当与 这会显示如果您修改了该文件会发生什么 。如果没有 只是修改时间仅在 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