makefile编写知识小结

本文介绍了Makefile中的宏定义、条件编译、命令控制以及文件操作等关键概念,如-D和-I用于编译选项,ifeq...endif进行条件判断,@隐藏命令输出,$(MAKE)调用make命令,-f指定makefile,export导出变量给子进程,install进行文件拷贝,wildcard和patsubst处理文件路径,以及赋值运算符的区别。这些知识点对于理解和编写Makefile至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、Makefile中的宏定义

-D 增加编译宏定义;-I增加头文件搜索路径;

示例:CFLAGS+=-D __CUSTOMER_CODE__,

          则编译时,只编译__CUSTOMER_CODE__宏定义的代码

示例二:

INCS =  -I $(ENX)
INCS += -I ./           \
        -I include      \
指定头文件查找的目录。

==================================================

2、ifeq  else  endif    条件编译,表示条件相等时执行某段代码

ifeq ( $(CLSO),GITW)
     C_PREDEF +=-D __$(CLON)__
else
    C_PREDEF+=-D __CUSTOMER_CODE__
endif

==================================================

3、@  在makefile 中语句前面表示,该语句不被回显出来。

4、$(MAKE)   表示预设的make命令的名称(路径),类似于预定义变量。

5、 -f 指定特定路径的makefile 文件

示例:$(MAKE) -f make/gcc_makefile

6、include   将指定文件包涵到当前的文件中,

示例:若在文件x 中增加:include make\gcc_make,将gcc_make 文件包涵在文件x中

==================================================================

7、export  向子make进程输出变量

示例::

all:
    @$(MAKE)  -f make/gcc_makefile

include make\gcc\gcc_makedef

export GCC_INSTALL_PATH C_PREDEF

将GCC_INSTALL_PATH C_PREDEF   传递给即将执行的gcc_makedef文件。

===============================================================

8、install  相当于文件拷贝

    用于将文件拷贝到指定目录。需要目标地址存在

   若目标地址不存在的情况下,使用install -d, 会自动创建目录

9、wildcard  扩展通配符,将指定目录下指定类型的所有文件展开(因为在变量的定义和函数引用时,原有通配符将失效),格式:$(wildcard PATTERN...)

     patsubst 替换通配符,将指定文件替换。

     notdir 去除路径通配符

    示例:${patsubst %.c, %, ${wildcard *.c}}

    wildcard -- 路径下的所有.c文件  

    patsubst ---  将路径下所有符合.c格式的文件替换

   src = $(wildcard *.c ./test/*.c)   ---- 输出  a.c  b.c  ./test/ax.c ./test/bx.c

   dir=$(notdir $(src)) --- 把路径中展开的文件去掉路径:使用notdir后, 输出为 a.c b.c  ax.c bx.c

10、% : %.c
    $(CC)  $(CFLAGS)  $< -o $@

    %:%.c  将所有.c文件编译为对于的目标文件

$@  表示目标文件
$^  表示所有的依赖文件
$<  表示第一个依赖文件
$?  表示比目标还要新的依赖文件列表

 //================================================

11、赋值运算符 = 、:=、?= 、+=

  11.1   使用 =  给变量赋值时,变量的值可以随赋值之后的定义变化。示例:

    a = test

    b = $(a)

    a = testx

   此时b = testx

   11.2 使用:=赋值时,变量的值等于赋值前定义好的值

   a = test

    b = $(a)

    a = testx

   此时b = test

11.3 使用?=赋值时,若变量之前被赋值过,则不再赋值,否则赋值为当前值。

   a = test

    b = $(a)

    b ?= testx

   此时b = test

   a = test

   b ?= testx

  此时b = testx

11.4 +=为追加赋值,在原有赋值的情况下,追加赋值,

 a = test.o test1.o

a+= test2.o

则 当前a = test.o test1.o test2.o

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值