学习杜老师推荐的Makefile教程视频,链接。记录下个人学习笔记,仅供自己参考。
之前有转载过杜老师的从零Makefile落地算法大项目文章,感兴趣的可以看看。
本课程主要讲解Makefile中的条件语句。(from ChatGPT)
Makefile中的ifeq/else/endif
是条件语句,用于根据变量或表达式的值选择不同的操作。语法结构如下:
ifeq (arg1, arg2)
# 满足条件时执行的操作
else ifeq (arg3, arg4)
# 满足条件时执行的操作
else
# 不满足条件时执行的操作
endif
其中,ifeq
和else ifeq
用于比较两个参数的值,如果相等则满足条件,执行对应的操作;else
表示上一个条件不满足时,执行的操作;endif
表示条件语句结束。
在Makefile中,条件语句可以用于设置变量、选择编译器、选择链接器、选择目标文件等,非常灵活。下面是一个简单的示例:
CC = gcc
ARCH = x86
ifeq ($(ARCH), arm)
CC = arm-linux-gcc
else ifeq ($(ARCH), mips)
CC = mips-linux-gcc
endif
main: main.c
$(CC) -o $@ $^
以上代码中,根据变量$(ARCH)
的值,选择不同的编译器。如果$(ARCH)
等于arm
,则使用arm-linux-gcc;如果$(ARCH)
等于mips
,则使用mips-linux-gcc;否则使用默认的gcc编译器。最终将main.c
编译成可执行文件main
。
ifneq
语法结构与ifeq
相似,都是Makefile中的条件语句,ifneq
表示当变量不相等时,执行其后的语句。语法结构如下:
ifneq (arg1, arg2)
# arg1 不等于 arg2 时执行的语句
else
# arg1 等于 arg2 时执行的语句
endif
示例如下:
CC = gcc
ifeq ($(CC), gcc)
CFLAGS = -Wall -O2
else
CFLAGS = -Wall
endif
在上面的例子中,如果$(CC)
的值为gcc,则CFLAGS的值为-Wall -O2
,否则CFLAGS的值为-Wall
ifdeq
语法结构:如果变量已定义,则执行后面的语句。否则执行else
语句或者直接跳过这个if
块
ifdef <variable>
<commands-if-variable-is-defined>
else
<commands-if-variable-is-not-defined>
endif
示例如下:
ifdef CC
CXX=$(CC)
else
CXX=g++
endif
在上面的例子中,如果变量$(CC)
已定义,则将CXX变量的值设为$(CC)
,否则将CXX设为g++
本次课程主要学习了Makefile中的三种不同的条件控制语句。