Makefile 中几种等号的用法

Maggie_Z2022-10-04 11:39:541条回答

已提交,审核后显示!提交回复

共1条回复
jobwanted 共回答了13个问题 | 采纳率84.6%
这种方式叫做“简单展开”,因为在读到makefile中的这一行时等号右边就立即被展开了,等号右边引用的所有变量(如例子中的CC)也会被立即展开.其行为与一般编程和脚本语言相同.
当等号右边引用的变量(如例子中的CC)还没有被定义时,它被展开成空(nothing)而不是空格之类.
2. =运算符,如MAKE_DEPEND = $(CC) -M
这种方式叫做“递归展开”,直到该变量被使用时等号右边的内容才会被展开,其实叫做“迟滞展开”更合适.神奇的是,这种展开方式可以不按顺序定义变量.比如:
MAKE_DEPEND = $(CC) -M
# Some time laterCC = gcc只要在此之前没有引用过MAKE_DEPEND就没问题. 另外,不止是“迟滞展开”,事实上每次使用该变量,等号右边的内容都会被重新展开.
3. ?=运算符,如OUTPUT_DIR ?= $(PROJECT_DIR)/out
“追加”方式. 其主要目的是给“递归展开”的变量追加内容.因为简单变量可以用simple := $(simple) new stuff的方式来追加内容;而对于递归展开的变量,recursive = $(recursive) new stuff会导致循环引用.这种情况只能用+=运算符.
1年前

相关推荐

$(CURDIR)/Makefile Makefile:; 这句话是什么含义呀?
$(CURDIR)/Makefile Makefile:; 这句话是什么含义呀?
cmd_crmodverdir = $(Q)mkdir -p $(MODVERDIR)
$(if $(KBUILD_MODULES),; rm -f $(MODVERDIR)/*)
这句里面if中怎么有个逗号,我自己写个$(if 1,;“aa”)会出错.
以上两句都是内核Makefile中原有的语句.
孤独小仙1年前1
skyer_006 共回答了16个问题 | 采纳率100%
应该是这样:$(if $(KBUILD_MODULES),; rm -f $(MODVERDIR)/*) 这个函数里面有个分号很奇怪,逗号前后分为两部分,前面条件成立返回 “ ; rm -f $(MODVERDIR)/* ”
分号的作用是结束上一个语句即:cmd_crmodverdir = $(Q)mkdir -p $(MODVERDIR) ;
分号后面另外一个语句 rm -f $(MODVERDIR)/*
条件不成立就不说了
Makefile的一句话,没看懂,请帮忙详细解释一下:
Makefile的一句话,没看懂,请帮忙详细解释一下:
OBJ_COMM和SRC_COMM都是变量名,$符后面的括号内的冒号和“.cpp=.o“是什么意思?
OBJ_COMM = $(SRC_COMM:.cpp=.o)
wanghz19791年前1
朱振锋 共回答了15个问题 | 采纳率93.3%
$(SRC_COMM:.cpp=.o)意思不就是替换扩展名吗,例如SRC_COMM = foo.cpp,那么OBJ_COMM就自动生成OBJ_COMM = foo.o
makefile中这句话什么意思啊
makefile中这句话什么意思啊
System.map:hello.or32
x05@$(NM) $< |
x05x05grep -v '(compiled)|(.o$$)|( [aUw] )|(..ng$$)|(LASH[RL]DI)' |
x05x05sort > System.map
亚aa1年前1
6805711 共回答了16个问题 | 采纳率93.8%
System.map: hello.or32 这句意思是生成System.map文件源自于hello.or32文件,下面的部分是方法说明
@是隐式输出这条语句的意思,即屏幕上看不到这条语句,去掉之,可见这条语句
NM 是环境变量或在这语句前定义的一个宏变量
$< 指的就是hello.or32
| 是管道 关于管道请查相应的资料, 简单说,就是|前面的语句的输出 是 其后的语句的输入
是行连接符,意思是这一行写不下了,下一行和这一行的信息应该连在一起作为一行信息
grep -v 是查找时滤掉后面的信息 即' '中的内容 引号中的这里是转义的意思,即不把后面的当作命令信息解释,
说白了,就是过滤掉 (compiled)|(.o$$)|( [aUw] )|(..ng$$)|(LASH[RL]DI) 这样的内容行
sort > System.map 意思就是将前面的输出进行排序,并将排序结果输出到System.map文件中
makefile里面 gcc -O2 -o $@ $< 是什么意思
郭姝1年前1
阿ee007 共回答了12个问题 | 采纳率100%
-O2表示优化选项,2表示最优优化,即编译器会优化你的程序;-o表示后边接的是文件名称;$@是Makefile的通配符,代指你前面指定的文件名,例如有规则%.o:%.c,那么$@表示xxx.o文件(xxx是你的源代码文件的名称前缀);$
MAKEFILE文件中的这句话什么意思,详细
MAKEFILE文件中的这句话什么意思,详细
driver_subdirs = $(addprefix $(DRIVERS_DIR)/,$(driver_dirs)) $(addprefix $(DRIVERS_DIR)/,$(extra_driver_dirs))
绯蓝水花1年前1
真情无价 共回答了12个问题 | 采纳率100%
addprefix 是makefile中的函数,是添加前缀的函数
例如:
$(addprefix src/,foo bar)

返回值为“src/foo src/bar”.
所以上面的意思是为dirver_dirs变量添加前缀,$(DRIVERS_DIR)/
makefile这句话什么意思?
makefile这句话什么意思?
.c.o:
$(CC) $(CFLAGS) -I$(DBM_INC_PATH) $(DFLAGS) -c $
刘惠子1年前1
jiangweibing 共回答了19个问题 | 采纳率84.2%
一般 $(CC) 指的就是gcc编译器,对于CFLAGS,我们可以
CFLAGS="-DDEBUG " 那么在跟$(CC)一起用时候,就可以将"-DDEBUG "这个编译参数加上了,
-I$(DBM_INC_PATH) -l就是要链接的库文件,那么后面这个变量,肯定就包含了你的动态链接库的文件位置了,DFLAGSS 这个变量肯定就是这个库要编译时候要加上的编译标志
-c 就是就 只编译不链接,生成的是.o 文件
$< 就是第一个依赖文件的名称
makefile之所以要这么写,目的就是要尽量做到“通用”,这就是makefile的特性.
关于makefile一个语句的疑问:$(MAKE) –C $$dir || exit 1,|| exit
tiev11年前1
joyee412 共回答了15个问题 | 采纳率80%
就是说:转到dir这个目录下面make,如果执行结果为0(失败)就执行exit 1,意思就是返回错误.
makefile 语法中 *.c表示所有后缀为c的文件.1.那么%.c表示的又是神马意思,二者区别是什么.2.*.c这个
makefile 语法中 *.c表示所有后缀为c的文件.1.那么%.c表示的又是神马意思,二者区别是什么.2.*.c这个语法是shell的语法 还是GUNmake的语法 是哪个层次的?
lihan0081年前1
lj19820529 共回答了15个问题 | 采纳率86.7%
“%”的意思是匹配零或若干字符,例如,“%.h”表示所有以“.h”结尾的文件.
它是在GUNmake的语法层次上的,例如 vpath %.h ../headers ,该语句表示,要求make在“../headers”目录下搜索所有以“.h”结尾的文件.
*是Shell所支持的通配符,是在shell的语法层次上,*.c,一般用在shell命令里面,如:
clean:
rm -f *.o
makefile中的@$是什么意思?
makefile中的@$是什么意思?
OBJS_BOOTPACK = bootpack.obj naskfunc.obj hankaku.obj graphic.obj dsctbl.obj
...
BIN2OBJ = $(TOOLPATH)bin2obj.exe
RULEFILE = $(TOOLPATH)haribote/haribote.rul
...
bootpack.bim :$(OBJS_BOOTPACK) Makefile
x09$(OBJ2BIM) @$(RULEFILE) out:bootpack.bim stack:3136k map:bootpack.map
x09x09$(OBJS_BOOTPACK)
搞不懂@$的意思
Bluesky11181年前2
huuh88 共回答了15个问题 | 采纳率100%
$@:代表规则中的目标文件名.如果目标是一个文档(Linux中,一般称.a文件为文档),那么它代表这个文档的文件名.在多目标的模式规则中,它代表的是哪个触发规则被执行的目标文件名.
关于Makefile的问题:$(REELS_OBJS):CFLAGS = -DOVERRIDE\(x\)=__\#\#x
关于Makefile的问题:$(REELS_OBJS):CFLAGS = -DOVERRIDE(x)=__##x
$(REELS_OBJS):CFLAGS = -DOVERRIDE(x)=__##x,
xiaochen0011年前1
uu的轻骑兵 共回答了15个问题 | 采纳率93.3%
$(REELS_OBJS):
这显然是定义一个目标文件CFLAGS = -DOVERRIDE(x)=__##x
这个就是定义变量CFLAGS

这个意思就是说, 把源代码中的 OVERRIDEx 替换为 __x

你查看你的源代码,里面肯定有OVERRIDEx 这样的变量.x可能不只是一个字符, 可能是一个字符串

如果有OVERRIDEx那么把它替换为 __x

其实这句的意思就是 -DOVERRIDEx == __x
加这么多() \ 什么的,是为了转义. ##是转化为字符串.
在某些Makefile中看到了 obj-m := test.o module-objs := test.o 请问modu
在某些Makefile中看到了 obj-m := test.o module-objs := test.o 请问module-objs := test.o什么作用
有obj-m := test.o不是就可以编译成模块了么
douzi00001年前1
云帆博流 共回答了23个问题 | 采纳率87%
声明:我的回答不一定正确.
obj-m := test.o是指定模块名称是test.ko.如果只是由test.o,来编译成test.ko,那后面的module-objs := test.o最好省略(我觉得你这2句话写一起,估计编译会出错).
但是有时候,test.ko是由test.o file1.o file2.o这样多个.o文件编译成test.ko模块,那需要:
obj-m := test.o
module-objs := file1.o file2.o test_main.o(注意,这里不要用test.o)
所以module-objs 用在多.o文件编译的时候.