谁能看懂下面这段Makefile代码我就服

jscsqb 2008-05-02 05:47:26
SRC = libsample.c
SRC.C = $(filter %.C, $(SRC))
.....
.....
$(SRC.C:%.C=%.c): #last line in this file
...全文
138 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
felish 2008-05-08
  • 打赏
  • 举报
回复
有点难度!
但还是有大侠给解了!看样子应该好好学学了!
geldqb 2008-05-08
  • 打赏
  • 举报
回复
1。是空
可用如下脚本进行确认:
-----------------------------
SRC = libsample.c #libsample.C
SRC.C = $(filter %.C, $(SRC))
all:
@echo "print SRC.C = "$(SRC.C)
-----------------------------

2。是宏展开的语法(http://radiofly.to/nishi/programming/make-guide.html)
$(SRC.C:%.C=%.c):
是将SRC.C中的所有.C作为后缀的文件替换成.c文件,并以此作为一个没有依赖的目标

a.如果SRC = libsample.C
则经过宏展开之后,最后一行就变成
libsample.c:

根据make规则,没有依赖的目标总是最新的,那么在Makefile中的其他地方,
所有以libsample.c作为依赖的目标都需要被更新。
但是如果libsample.c不存在,那么根据Make的另一个规则,不存在的目标都是最旧的,
该目标需要被更新。那么这个不存在的libsample.c会被更新成最新的,
这样又得到所有以libsample.c作为依赖的目标都需要被更新这个结论。


b.如果SRC = libsample.c
则经过宏展开之后,最后一行就变成
:
无目标,无依赖,无规则,就是什么都不做。



欢迎拍砖。
jscsqb 2008-05-07
  • 打赏
  • 举报
回复
谢谢 bshawk和大家。

有以下几个问题:
1。SRC.C的值为多少?
如果SRC=libsample.c ,
那么SRC.C=(空)?还是SRC.C=libsample.c?
这里区分大小写吗?

2。最后一行 $(SRC.C:%.C=%.c): 是一个什么规则都没有的目标。
它到底能起到什么样的作用?
就是转换文件后缀(大写到小写)用的吗?
为什么一个什么规则都没有的目标可以起到转换后缀的作用?


谢谢。
air_snake 2008-05-07
  • 打赏
  • 举报
回复
1.个人认为是后者
2.你要看看Makefile的语法书了
bshawk 2008-05-02
  • 打赏
  • 举报
回复
我来回答下,各位排砖:)
SRC = libsample.c # 得到原文件列表为 “libsample.c”
SRC.C = $(filter %.C, $(SRC)) # 将上面得到的原文件列表进行过滤,找出形如*.C的文件列表,保存到SRC.C中
.....
.....
$(SRC.C:%.C=%.c): # 将SRC.C中的*.C文件转化成*.c输出(实际存在于文件系统中的的文件名并没有改变),并作为taget
dxing_1983 2008-05-02
  • 打赏
  • 举报
回复
知道答案了贴下,哈哈
dxing_1983 2008-05-02
  • 打赏
  • 举报
回复
好象绕一圈又回去了
yangb2014# 2008-05-02
  • 打赏
  • 举报
回复
有什么问题么?

把整个文件贴出来。。。

23,107

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧