IT袋

当前位置:主页 > 经验教程 > 系统教程 >

Linux

Linux Makefile文件详解(4)

时间:2024-02-22 18:39:19 来源:IT袋 作者:马勇
导读:Linux,16. 自动生成依赖关系 使用  -M  选项可以让编译器自动生成依赖关系。这对于跟踪头文件之间的依赖关系很有帮助。 # 自动生成依赖关系%.d: %.c $(CC) -M $

Linux

16. 自动生成依赖关系

使用 -M 选项可以让编译器自动生成依赖关系。这对于跟踪头文件之间的依赖关系很有帮助。

# 自动生成依赖关系
%.d: %.c
    $(CC) -M $< > $@

17. include 指令

使用 include 指令可以将其他 Makefile 文件包含进当前 Makefile 中。

# 包含其他 Makefile 文件
include other.mk

18. 示例

下面是一个简单的 C 语言项目的 Makefile 示例:

CC = gcc
CFLAGS = -Wall
LDFLAGS =
SRCDIR = src
OBJDIR = obj
BINDIR = bin
SOURCES = $(wildcard $(SRCDIR)/*.c)
OBJECTS = $(patsubst $(SRCDIR)/%.c,$(OBJDIR)/%.o,$(SOURCES))
EXECUTABLE = $(BINDIR)/my_program
all: $(EXECUTABLE)
$(EXECUTABLE): $(OBJECTS)
    $(CC) $(LDFLAGS) -o $@ $^
$(OBJDIR)/%.o: $(SRCDIR)/%.c
    $(CC) $(CFLAGS) -c -o $@ $<
clean:
    rm -rf $(OBJDIR)/*.o $(EXECUTABLE)

这个 Makefile 文件描述了一个简单的项目结构,其中源文件位于src目录,目标文件位于obj目录,可执行文件位于bin目录。这个 Makefile 包含了all(默认目标)、clean(清理目标)等规则。

19. 函数

Makefile 支持一些内建的函数,用于处理字符串、路径等。常用的函数包括 $(wildcard)$(patsubst)$(foreach), 等等。

# 获取所有.c文件的列表
C_FILES = $(wildcard src/*.c)
# 将.c文件替换成.o文件
O_FILES = $(patsubst src/%.c, obj/%.o, $(C_FILES))
# 使用foreach迭代
SOURCES = file1.c file2.c file3.c
OBJECTS = $(foreach src, $(SOURCES), obj/$(src:.c=.o))

20. 条件语句

Makefile 中可以使用条件语句,根据不同的条件执行不同的指令。

# 条件语句
ifeq ($(DEBUG),1)
    CFLAGS += -g
else
    CFLAGS += -O2
endif

21. 递归调用

Makefile 可以通过递归调用来构建子目标。

# 递归调用
subtarget:
    $(MAKE) -C subdir

22. 示例

下面是一个包含多个源文件、头文件以及库文件的 Makefile 示例:

CC = gcc
CFLAGS = -Wall
LDFLAGS =
SRCDIR = src
INCDIR = include
OBJDIR = obj
BINDIR = bin
LIBDIR = lib
SOURCES = $(wildcard $(SRCDIR)/*.c)
HEADERS = $(wildcard $(INCDIR)/*.h)
OBJECTS = $(patsubst $(SRCDIR)/%.c,$(OBJDIR)/%.o,$(SOURCES))
EXECUTABLE = $(BINDIR)/my_program
LIBRARY = $(LIBDIR)/libmylibrary.a
all: $(EXECUTABLE) $(LIBRARY)
$(EXECUTABLE): $(OBJECTS)
    $(CC) $(LDFLAGS) -o $@ $^
$(LIBRARY): $(OBJECTS)
    ar rcs $@ $^
$(OBJDIR)/%.o: $(SRCDIR)/%.c $(HEADERS)
    $(CC) $(CFLAGS) -I$(INCDIR) -c -o $@ $<
clean:
    rm -rf $(OBJDIR)/*.o $(EXECUTABLE) $(LIBRARY)

这个 Makefile 描述了一个包含多个源文件的项目,其中包括了默认目标 

相关阅读