在Linux系统中,make
命令是一个强大的工具,用于自动化编译和构建程序,它可以减少重复的编译任务,提高开发效率。make
通过读取一个名为Makefile
的文件,执行指定的编译指令,这个文件包含了一系列规则来指示make
如何构建程序。
Linux make命令介绍
make
(全称无需拼写,通常就简称为make)是自动化编译工具,它会读取名为Makefile
的文件,这个文件定义了一套规则来指定程序的依赖关系以及如何编译和链接程序。通过使用make
,开发人员可以仅仅输入简单的make
命令来构建复杂的程序,而不需要手动执行编译器和链接器等一系列命令。
Linux make命令适用的Linux版本
make
命令几乎在所有的Linux发行版中都是可用的,因为它是GNU项目的一部分,是Linux开发工具链的标准组件。然而,在不同的发行版,尤其是CentOS 7和CentOS 8中,安装make
的命令可能略有不同。
对于基于Debian的系统(如Ubuntu),可以使用apt-get
安装:
[linux@bashcommandnotfound.cn ~]$ sudo apt-get update
[linux@bashcommandnotfound.cn ~]$ sudo apt-get install make
对于CentOS 7,使用yum
安装:
[linux@bashcommandnotfound.cn ~]$ sudo yum install make
对于CentOS 8及其衍生版本,使用dnf
安装:
[linux@bashcommandnotfound.cn ~]$ sudo dnf install make
Linux make命令的基本语法
基本的make
命令语法格式如下:
make [options] [target] ...
options
:make
的选项,例如-f
指定一个特定的Makefile
文件。target
:make
要构建的目标,通常在Makefile
中定义。
Linux make命令的常用选项或参数说明
下面是make
命令的一些常用选项:
选项 | 描述 |
---|---|
-b | 总是被忽略,因为是默认行为。 |
-B | 无条件地构建所有目标。 |
-C <dir> | 在执行make之前先切换到指定的目录。 |
-d | 打印调试信息。 |
-e | 环境变量覆盖makefile中的变量。 |
-f <file> | 指定一个特定的Makefile 文件。 |
-i | 忽略所有的错误。 |
-j <num> | 并行执行多个任务。 |
-k | 即使出现错误也继续执行其他规则。 |
-n | 打印命令而不执行它们。 |
-o <file> | 认为指定的文件是最新的,不需要更新。 |
-p | 打印make 将执行的所有规则。 |
-q | 询问模式。不执行命令,只检查是否更新。 |
-s | 静默模式。不打印命令。 |
-v | 打印make版本信息。 |
-w | 打印进入和退出目录的信息。 |
Linux make命令的实例
实例 1:最基础的Makefile
假设我们有一个简单的C程序,包含一个源文件main.c
。
// main.c
#include <stdio.h>
int main() {
printf("Hello, World!\n");
return 0;
}
我们可以为这个程序创建以下Makefile
:
all:
gcc main.c -o hello
当你在包含这个Makefile
的目录中运行make
命令时,它会执行gcc main.c -o hello
命令,编译main.c
文件并生成一个名为hello
的可执行文件。
实例 2:使用变量和模式规则
如果项目变得更加复杂,包含多个源文件,使用变量和模式规则会更有帮助。
CC=gcc
CFLAGS=-Wall -g
OBJS=main.o utils.o
all: hello
hello: $(OBJS)
$(CC) $(CFLAGS) -o hello $(OBJS)
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm -f *.o hello
在这个Makefile
中:
CC
变量用于指定编译器。CFLAGS
变量包含编译选项。OBJS
变量包含所有的对象文件。all
目标依赖于hello
目标,它使用OBJS
变量来链接所有对象文件。- 模式规则
%.o: %.c
用于从每个.c
文件生成相应的.o
文件。 clean
目标用于清理项目,删除所有的对象文件和可执行文件。
实例 3:为不同的目标指定特定的命令和依赖性
在更复杂的Makefile
中,你可能需要为不同的目标指定特定的命令和依赖性。
CC=gcc
CFLAGS=-Wall -g
all: program1 program2
program1: program1.o utils.o
$(CC) $(CFLAGS) -o program1 program1.o utils.o
program2: program2.o utils.o
$(CC) $(CFLAGS) -o program2 program2.o utils.o
clean:
rm -f *.o program1 program2
%.o: %.c
$(CC) $(CFLAGS) -c $<
在这个Makefile
中:
- 有两个独立的程序,
program1
和program2
,它们共享一些源文件。 program1
和program2
目标分别有自己的依赖性和链接命令。clean
目标像以前一样用于清理构建。
实例 4:使用条件语句
有时候,你可能需要根据不同的条件来编译你的程序。这可以通过在Makefile
中使用条件语句来实现。
CC=gcc
CFLAGS=-Wall -g
OBJS=main.o utils.o
ifeq ($(OS),Windows_NT)
RM=del /Q
FixPath=$(subst /,\,$1)
else
RM=rm -f
FixPath=$1
endif
all: hello
hello: $(OBJS)
$(CC) $(CFLAGS) -o hello $(OBJS)
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
clean:
$(RM) $(call FixPath,*.o hello)
在这个Makefile
:
ifeq
和else
语句用于检测操作系统类型并设置相应的删除命令和路径修正函数。RM
变量根据操作系统设置了正确的删除命令。FixPath
是一个函数,用于在Windows上修正路径格式。
高级技巧
使用变量定义
在Makefile
中,可以使用变量来简化和管理复杂的编译选项。例如:
CC=gcc
CFLAGS=-Wall -g
all: myprogram
myprogram: myprogram.o
$(CC) $(CFLAGS) -o myprogram myprogram.o
在这里,CC
和CFLAGS
是变量,它们被用于编译命令中,使得修改编译器或编译选项更加方便和集中。
模式规则
模式规则可以让你定义如何从一类文件生成另一类文件的规则,例如从.c
文件生成.o
对象文件:
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
这里%
是一个通配符,它匹配目标文件和依赖文件的共同名称部分。
Linux make命令的注意事项
- 确保
make
命令已经安装在系统中。如果你尝试运行make
却收到了bash: make: command not found
的消息,请按照上面的指导进行安装。 - 在编写
Makefile
时,必须使用Tab
键对命令进行缩进,而不是空格。 - 对于复杂项目,确保
Makefile
中的依赖关系是正确和完整的,以防止编译错误或不必要的重编译。
评论区