侧边栏壁纸
Linux入门自学网博主等级

每日学一条Linux命令,终成Linux大神

  • 累计撰写 725 篇文章
  • 累计创建 143 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Linux make命令教程:编译管理的艺术(附案例详解和注意事项)

在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] ...
  • optionsmake的选项,例如-f指定一个特定的Makefile文件。
  • targetmake要构建的目标,通常在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中:

  • 有两个独立的程序,program1program2,它们共享一些源文件。
  • program1program2目标分别有自己的依赖性和链接命令。
  • 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

  • ifeqelse语句用于检测操作系统类型并设置相应的删除命令和路径修正函数。
  • RM变量根据操作系统设置了正确的删除命令。
  • FixPath是一个函数,用于在Windows上修正路径格式。

高级技巧

使用变量定义

Makefile中,可以使用变量来简化和管理复杂的编译选项。例如:

CC=gcc
CFLAGS=-Wall -g

all: myprogram

myprogram: myprogram.o
    $(CC) $(CFLAGS) -o myprogram myprogram.o

在这里,CCCFLAGS是变量,它们被用于编译命令中,使得修改编译器或编译选项更加方便和集中。

模式规则

模式规则可以让你定义如何从一类文件生成另一类文件的规则,例如从.c文件生成.o对象文件:

%.o: %.c
    $(CC) $(CFLAGS) -c $< -o $@

这里%是一个通配符,它匹配目标文件和依赖文件的共同名称部分。

Linux make命令的注意事项

  • 确保make命令已经安装在系统中。如果你尝试运行make却收到了bash: make: command not found的消息,请按照上面的指导进行安装。
  • 在编写Makefile时,必须使用Tab键对命令进行缩进,而不是空格。
  • 对于复杂项目,确保Makefile中的依赖关系是正确和完整的,以防止编译错误或不必要的重编译。
0

评论区