1、今天在看Makefile文件的时候看到了一个BUILD_SO = $(LSRCS:%.c=$(BUILD_DIR)/%.o) ,不太明白这个具体是什么含义。在网上找了一下根据前人的分享,自己也记录一下:
BUILD_SO = $(LSRCS:%.c=$(BUILD_DIR)/%.o) ,这句代码的意思将变量LSRCS中所有的以.c结尾的文件都用目录BUILD_DIR下的.o替换。
另外:wildcard可以后面跟多个路径,使用方法如下:
假如我在当前目录下创建一个test目录,在test 目录下创建两个文件1.c和2.c;再test目录再新建一个子目录sub,在子目录sub下新建sub1.c和sub2.c。我们在test目录下使用Makefile可以这样写:
src=$(wildcard *.c ./sub/*.c)
all:
@echo $(src)
这样就会输出
1.c 2.c ./sub/sub1.c ./sub/sub2.c
使用@echo 这样终端输出的信息就是命令之后的结果,而不会在终端上把命令也打印出来。即如果去掉@ 终端打印的信息就是:
echo a.c b.c ./sub/sub1.c ./sub/sub2.c
1.c 2.c ./sub/sub1.c ./sub/sub2.c
这样一个结果。
如果在输出的结果中不想带./sub/这个路径的话,可以使用notdir,使用方法:
dir=$(notdir $(src))
这样输出出来就是:1.c 2.c sub1.c sub2.c了。
obj=$(patsubst %.c,%.o,$(dir)),把上面$(dir)变量里面以.c结尾的文件全部替换为.o结尾。
跟这个等效的一句程序是上面那句: BUILD_SO = $(LSRCS:%.c=$(BUILD_DIR)/%.o) 类似,
obj=$(dir:%.c=%.o);
他的标准格式应该是:
$(var:a=b) 或 ${var:a=b}
它的含义是把变量var中的每一个值结尾用b替换掉a。
--------------------------------------------------------------------------------------------------------------------
补充:
1、Makefiel中foreach的使用:
通用表达式: $(foreach <var>,<list>,<text>)
这个的意思就是:把list中遍历一遍,取出其中的每一个单词放到 var中,最后按照执行text的表达式。执行text表达式的时候,每次返回一个字符串,然后以空格隔开,最后text返回的每个字符串组成的整个字符都将是foreach函数的返回值。