Linux系统编程04-Makefile

  • 文件命名: makefile 或 Makefile

  • 规则:

    • 一个Makefile文件中可以有一个或多个规则

      目标 ...: 依赖 ...

      ​ 命令(shell命令)

      ​ ...

    • 目标: 最终生成的文件

    • 依赖: 生成目标所需要的文件或者目标

    • 命令: 通过执行命令对依赖操作生成目标(命令前必须tab缩进)

  • 命令在执行之前, 需要先检查规则中的依赖是否存在

  • 检测更新, 在执行规则中的命令时, 会比较目标和依赖文件的时间

  • 自定义变量 : 变量名=变量值 var=hello ; 获取变量:$(var)

  • 预定义变量:

    • AR: 归档维护程序的名称, 默认ar
    • CC: C编译器的名称, 默认cc
    • CXX: C++编译器名称, 默认g++
    • $@: 目标的完整名称
    • $<: 第一个依赖文件的名称
    • $^: 所有依赖文件
  • 函数:

    • $(wildcard PATTERN...)
      • 获取指定目录下指定类型的文件列表
      • 参数:PATTERN 指的是某个或多个目录下的对应的某种类型的文件,如果有多个目录,一般使用空格间隔
      • 返回:得到的若干个文件的文件列表,文件名之间使用空格间隔
      • 示例:$(wildcard *.c ./sub/*.c) 返回值格式: a.c b.c c.c d.c e.c f.c
    • $(patsubst <pattern>,<replacement>,<text>)
      • 查找中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔)是否符合模式,如果匹配的话,则以替换。
      • 返回:函数返回被替换过后的字符串
      • 示例:$(patsubst %.c, %.o, x.c bar.c) 返回值格式: x.o bar.o

示例:

# VERSION 1
# hello: main.cpp printhello.cpp factorial.cpp
# 	g++ -o hello main.cpp printhello.cpp factorial.cpp

# VERSION 2
# CXX = g++
# TARGET = hello
# OBJ = main.o printhello.o factorial.o

# $(TARGET): $(OBJ)
# 	$(CXX) -o $(TARGET) $(OBJ)

# main.o: main.cpp
# 	$(CXX) -c main.cpp

# printhello.o: printhello.cpp
# 	$(CXX) -c printhello.cpp

# factorial.o: factorial.cpp
# 	$(CXX) -c factorial.cpp

# VERSION 3
# CXX = g++
# TARGET = hello
# OBJ = main.o printhello.o factorial.o

# CXXFLAGS = -c -Wall

# $(TARGET): $(OBJ)
# 	$(CXX) -o $@ $^

# %.o: %.cpp
# 	$(CXX) $(CXXFLAGS) $< -o $@

# .PHONY: clean
# clean:
# 	rm -f *.o $(TARGET)

# VERSION 4
CXX = g++
TARGET = hello
SRC = $(wildcard *.cpp)
OBJ = $(patsubst %.cpp, %.o, $(SRC));
CXXFLAGS = -c -Wall

$(TARGET): $(OBJ)
	$(CXX) -o $@ $^

%.o: %.cpp
	$(CXX) $(CXXFLAGS) $< -o $@

.PHONY: clean
clean:
	rm -f *.o $(TARGET)
posted @ 2022-10-14 22:04  言叶以上  阅读(13)  评论(0编辑  收藏  举报