Makefile基本语法

目标、依赖、命令

  • 目标:要生成的文件名,可执行文件,或对象文件
  • 依赖:生成目标所需要的文件和其他目标,位于目标后边
  • 命令:创建目标文件所需要执行的命令

示例

target: dependencies
	commands
$(TARGET) : $(OBJS)

    $(CC)  $(CXXFLAGS) $(OBJS) -o $(TARGET) $(LIBSPATH) $(LIBS)

详情请参考示例文件

注释

  • # 用于添加注释,从 # 开始到该行末尾的所有内容都会被忽略。

Makefile变量

自动变量

简介

不需要明确定义的变量,在特定的上下文中自动获取值

说明
  • $@ 表示规则中的目标文件
  • $< 表示规则中第一个依赖文件名
  • $^ 表示规则中所有依赖文件列表以空格分割
  • $? 表示比目标文件更新的依赖文件列表,以空格分割
  • $* 表示目标文件去掉后缀的部分,在[[规则模式]]特别有用
  • $+ 类似于$^,但它包括了重复的依赖文件

自定义变量

预定义变量也属于自定义变量

示例

请参考下方示例,此处为示例的解释

下面逐一解析这些自定义变量及其含义:

  1. TARGET

    • 默认值为 ./out/myjson.out
    • 通过 ?= 操作符赋值,意味着如果在调用 make 时没有指定 TARGET 的值,则默认使用此值。
    • 指定了构建的目标文件路径和名称。
  2. CC

    • 被设置为 g++,指定了用于编译项目的 C++ 编译器。
  3. CXXFLAGS

    • 编译器选项,包括:
      • -g:生成调试信息。
      • -std=c++11:使用 C++11 标准。
      • -fno-elide-constructors:禁用构造函数消除优化。
      • -Wall:打开大多数编译警告。
      • -O2:使用第二级别的优化。
      • -pthread:启用 POSIX 线程库的支持。
  4. LIBSPATH

    • 指定库文件搜索路径,这里是 ./lib
  5. LIBS

    • 链接的库,初始包含 -lyhlog,后来添加了 -lstdc++
    • 使用 += 进行追加,表明可能链接多个库。
  6. INCDIRS

    • 包含的头文件目录,初始包括 includesrcsrc/protocol
    • 使用 += 追加目录。
  7. SRCDIRS

    • 源文件目录,初始设置为 srcsrc/protocol
    • 也是使用 += 追加目录。
  8. INCLUDE

    • 根据 INCDIRS 中的目录生成的 -I 包含标志,用于指示编译器查找头文件的目录。
  9. CFILES

    • 使用 foreachwildcard 函数,搜索 SRCDIRS 中的所有 .cpp 文件。
  10. CFILENDIR

    • 使用 notdir 函数从 CFILES 中移除路径,只留下文件名。
  11. CXXOBJS

    • CFILENDIR 中的 .cpp 文件名后缀替换为 .o,并放入 obj/ 目录中,生成目标文件列表。
  12. OBJS

    • 现在等同于 CXXOBJS。这样设计可能是为了保留将来添加不同类型对象文件的灵活性。
  13. VPATH

    • 用于指定 make 应该搜索源文件的目录列表。在这个 Makefile 中,它被设置为包含所有源文件目录的 SRCDIRS

整个构建过程中使用这些变量来控制编译器和链接器的行为,从而灵活地管理项目的构建过程。

引用变量

引用变量:使用 $(变量名) 的方式引用变量。

all:
	$(CC) $(CFLAGS) main.c -o main

模式规则

  • 使用 % 作为通配符,可以定义模式规则,来匹配多个目标。
    makefileCopy code
    %.o: %.c $(CC) $(CFLAGS) -c $< -o $@

伪目标

伪目标不是文件名,是一个标记执行特定任务

.PHONY:clean 
clean:
	rm -f *

示例


TARGET		  	?= ./out/test.out

CC 				:= g++
CXXFLAGS  		:= -g -std=c++11 -fno-elide-constructors -Wall -O2 -pthread

LIBSPATH 		:= -L./lib
LIBS    		+= -llog
LIBS    		+= -lstdc++

INCDIRS 		:= include
INCDIRS       	+= src

SRCDIRS		:= src


INCLUDE		:= $(patsubst %, -I %, $(INCDIRS))
CFILES			:= $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.cpp))
CFILENDIR		:= $(notdir  $(CFILES))

CXXOBJS			:= $(patsubst %, obj/%, $(CFILENDIR:.cpp=.o))
OBJS					:= $(CXXOBJS)

#makefile会自动在 内置变量VPATH 中去找.cpp文件
VPATH			:= $(SRCDIRS)
 

.PHONY: clean
	
$(TARGET) : $(OBJS)
	$(CC)  $(CXXFLAGS) $(OBJS) -o $(TARGET) $(LIBSPATH) $(LIBS)
 
$(CXXOBJS) : obj/%.o : %.cpp
	$(CC) $(CXXFLAGS) -c $(INCLUDE) -o $@ $<
	
clean:
	rm -rf $(TARGET) $(CXXOBJS)
 
	

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值