写点什么

makefile | AI 工程化部署

作者:AIWeker
  • 2023-12-26
    福建
  • 本文字数:1585 字

    阅读完需:约 5 分钟

C/C++编译工具:makefile

什么是 makefile

Makefile 是一种用于管理和组织源代码的工具,通常用于构建和编译软件项目。它由一系列规则组成,每个规则指定如何生成一个或多个目标文件。Makefile 也包括变量和注释,使得用户能够灵活地配置和定制构建过程。


Makefile 通常用于 C、C++和其他编程语言的项目中,它可以自动化编译、链接和打包过程,减少了手动执行命令的工作量。通过 Makefile,开发人员可以轻松地管理项目中的各种依赖关系和构建规则,确保代码的可维护性和可靠性。


Makefile 是一种强大的工具,可以帮助开发人员更加高效地构建和管理软件项目。

基本使用

Makefile 的基本使用是通过编写规则来描述每个目标文件的依赖关系和构建步骤。每个规则由一个目标、一个或多个依赖项和相应的命令组成。


下面是一个简单的 Makefile 示例,用于编译一个 C 程序:


# 定义变量CC = gccCFLAGS = -Wall
# 默认构建目标all: myprog
# 构建规则myprog: myprog.o utils.o $(CC) $(CFLAGS) -o myprog myprog.o utils.o
myprog.o: myprog.c $(CC) $(CFLAGS) -c myprog.c
utils.o: utils.c $(CC) $(CFLAGS) -c utils.c
# 清理规则clean: rm -f myprog *.o
复制代码


在这个示例中,我们首先定义了一些变量,如 CC 表示编译器,CFLAGS 表示编译选项。然后定义了一个默认的构建目标"all",它依赖于"myprog"。接下来定义了"myprog"、"myprog.o"和"utils.o"这三个目标的构建规则,分别指定了它们的依赖关系和构建命令。最后定义了一个清理规则"clean",用于删除生成的可执行文件和目标文件。


通过这个 Makefile,我们可以通过运行"make"命令来编译和构建我们的 C 程序。例如,运行"make clean"可以清理生成的文件,运行"make"可以编译整个项目。


这就是一个简单的 Makefile 示例,它展示了如何使用 Makefile 来管理 C 程序的编译和构建过程。

进阶使用

关键字和函数

在 Makefile 中,有一些重要的关键字和函数,下面列出了其中一些:


  1. 关键字:

  2. target: dependencies:定义目标及其依赖

  3. $(variable):引用变量的值

  4. all:一个默认目标,执行 make 命令时会被执行

  5. clean:清理文件的目标

  6. 函数:

  7. $(wildcard pattern):匹配文件名


      # 查找所有的.c文件      sources := $(wildcard *.c)
复制代码


  • $(patsubst pattern,replacement,text):替换字符串


      # 将所有.c文件替换为.o文件      objects := $(patsubst %.c,%.o,$(sources))
复制代码


  • $(shell command):执行 shell 命令


      # 获取当前目录      curdir := $(shell pwd)
复制代码


  • ifeqendif:条件判断


      # 判断变量的值      ifeq ($(debug),yes)      CFLAGS = -g      else      CFLAGS = -O2      endif
复制代码


这些关键字和函数是 Makefile 中非常重要的部分,它们可以帮助你定义目标、处理文件、执行命令和进行条件判断。


在 Makefile 中,$@$^是自动化变量,用于表示目标和所有的依赖文件。


  • $@ 表示当前规则中的目标文件名。

  • $^ 表示所有的依赖文件列表,以空格分隔。


例如,考虑以下示例:


# 定义一个规则program: main.o func1.o func2.o  gcc -o $@ $^
复制代码


在这个示例中,$@会被替换为 "program",$^会被替换为 "main.o func1.o func2.o"。这样,当 make 命令执行时,会将 main.o、func1.o 和 func2.o 链接在一起生成名为 program 的可执行文件。

编译多个目标

在一个 Makefile 中,你可以为不同的源文件设置多个目标来编译。下面是一个简单的示例:


# 定义变量CC = gccCFLAGS = -Wall -g
# 设置第一个目标all: program1 program2
# 编译第一个源文件为 program1program1: program1.c $(CC) $(CFLAGS) -o program1 program1.c
# 编译第二个源文件为 program2program2: program2.c $(CC) $(CFLAGS) -o program2 program2.c
# 清理文件clean: rm -f program1 program2
复制代码


在这个示例中,我们定义了两个目标 program1program2,并分别指定了它们依赖的源文件。当你运行 make 命令时,Makefile 将会编译这两个目标。

发布于: 刚刚阅读数: 4
用户头像

AIWeker

关注

InfoQ签约作者 / 公众号:人工智能微客 2019-11-21 加入

人工智能微客(aiweker)长期跟踪和分享人工智能前沿技术、应用、领域知识,不定期的发布相关产品和应用,欢迎关注和转发

评论

发布
暂无评论
makefile | AI工程化部署_c_AIWeker_InfoQ写作社区