Makefile

简介: Makefile

Makefile

Makefile 是一种用于自动化构建程序的工具,通常与 C、C++ 等编程语言一起使用。它包含了一系列规则,用于描述如何从源文件生成目标文件,以及如何将目标文件链接成最终的可执行文件或库文件。下面让我举一些例子来介绍Makefile。

 1.目标 (Target):
在 Makefile 中,目标是指我们要生成的文件,可以是可执行文件、目标文件或库文件。
 2.依赖 (Dependencies):
每个目标可能依赖于其他文件,这些文件称为依赖。如果目标文件的某个依赖文件发生了变化,那么该目标需要重新构建。
 3.规则 (Rules):
Makefile 中的规则定义了如何生成目标文件。它包括目标、依赖和生成命令。
 4.变量 (Variables):
变量在 Makefile 中用于存储重复使用的值,比如编译器名称、编译选项等。
 5.注释 (Comments):
在 Makefile 中可以使用 # 符号来添加注释,用于提高代码的可读性。

示例代码:
 示例 1:简单的 C 程序
假设我们有一个简单的 C 程序,由 main.c 和 helper.c 组成,需要生成一个名为 my_program 的可执行文件。

CC = gcc
CFLAGS = -Wall -O2
SRC = main.c helper.c
OBJ = $(SRC:.c=.o)
TARGET = my_program
$(TARGET): $(OBJ)
    $(CC) $(CFLAGS) $^ -o $@
%.o: %.c
    $(CC) $(CFLAGS) -c $< -o $@
clean:
    rm -f $(OBJ) $(TARGET)



在这个示例中:
CC 定义了编译器。
CFLAGS 定义了编译选项。
SRC 包含了所有的源文件。
OBJ 是由源文件生成的目标文件。
$(TARGET) 是生成的可执行文件。
规则定义了如何生成目标文件和最终的可执行文件。
clean 目标用于清理生成的目标文件和可执行文件。

 示例 2:使用变量和函数

CC = gcc
CFLAGS = -Wall -O2
SRC_DIR = src
BUILD_DIR = build
TARGET = my_program
SRCS = $(wildcard $(SRC_DIR)/*.c)
OBJS = $(SRCS:$(SRC_DIR)/%.c=$(BUILD_DIR)/%.o)
$(BUILD_DIR)/$(TARGET): $(OBJS)
    $(CC) $(CFLAGS) $^ -o $@
$(BUILD_DIR)/%.o: $(SRC_DIR)/%.c
    $(CC) $(CFLAGS) -c $< -o $@
.PHONY: clean
clean:
    rm -rf $(BUILD_DIR)/*.o $(BUILD_DIR)/$(TARGET)



 这个示例中,我们使用了 wildcard 函数来获取源文件列表,并使用变量和函数来简化 Makefile 的编写。
 示例 3:多目标和伪目标

all: program1 program2
program1: program1.o
    $(CC) $(CFLAGS) $^ -o $@
program2: program2.o
    $(CC) $(CFLAGS) $^ -o $@
%.o: %.c
    $(CC) $(CFLAGS) -c $< -o $@
.PHONY: clean
clean:
    rm -f *.o program1 program2


 这个示例中,我们定义了多个目标,以及一个伪目标 clean。当执行 make all 时,会生成 program1 和 program2。
 通过以上示例,你可以了解一些基础的关于Makefile的知识 ,并学会如何编写简单而强大的构建规则来管理你的项目。 Makefile 的强大之处在于它可以自动化编译和链接过程,使得项目的构建变得简单和可靠。

 

相关文章
|
IDE Unix 编译器
Makefile
Makefile
57 0
|
Java C语言
Makefile2
规范 target可以是Object file, 可执行文件或者标签(标签一般没有依赖) 越靠近最终结果的target卸载越前面 定义target前, 定义CC, SRC, CFLAGS, OBJS, INCLUDES, RM, COPY等变量方便修改 在以前使用gcc编译时, 一般直接使用gcc编程链接成可执行文件, 但是在makefile中.
961 0
|
Shell
Makefile 使用总结
1. Makefile 简介 Makefile 是和 make 命令一起配合使用的. 很多大型项目的编译都是通过 Makefile 来组织的, 如果没有 Makefile, 那很多项目中各种库和代码之间的依赖关系不知会多复杂.
736 0