makefile 通配符了解% $@ $^ $<
把目录下所有文件都编译的命令。
1 all:$(subst .c,.o,$(wildcard *.c)) 2 3 %.o:%.c 4 gcc -o $@ $<
下面是几个特舒符号的意思:
$@:目标的名字
$^:构造所需文件列表所有所有文件的名字
$<:构造所需文件列表的第一个文件的名字
$?:构造所需文件列表中更新过的文件
例如:
1 test1.o:test1.c 2 gcc -o $@ $<
$@:就是test1.o
$<:就是test1.c
1 test1.o:test1.c head.c 2 gcc -o $@ $^
$^:就是test1.c head.c
$(subst 要被替换的字符串,用来替换的字符串,被处理的字符串):
用“用来替换的字符串”替换“被处理的字符串”中的“要被替换的字符串”
所以:
$(subst .c,.o,test1.c test2.c)
就会得到test1.o test2.o
$(wildcard 寻找的文件):
在系统中寻找文件
例如:
$(wildcard *.c)
就等于找到系统中所有后缀为.c的文件,返回成以空格隔开的一整行字符
例如:test1.c test2.c test3.c 这样
$(basename 文件名):
取得文件的名字(去掉后缀的意思)
例如:
$(basename test1.c)
就会取得test1
例子1:
CPPLIST = $(wildcard *.cpp) # get cpp file list TARGET = $(patsubst %.cpp, %, $(CPPLIST)) # get corresponding target file all: $(TARGET) @echo ------------------ @echo log1: $(TARGET) @echo log2: $(CPPLIST) %:%.cpp g++ $< -o $@ clean: rm -f $(TARGET)
例子2:
CC := g++ CFLAGS := -g TARGET := test SRCS := $(wildcard *.cpp) OBJS := $(patsubst %cpp,%o,$(SRCS)) all:$(TARGET) %.o:%.cpp $(CC) $(CFLAGS) -c $< $(TARGET):$(OBJS) $(CC) $(CFLAGS) -o $@ $^ clean: rm -rf $(TARGET) *.o 其中wildcard和patsubst为关键字, $(wildcard *.cpp /xxx/xxx/*.cpp) 为获取当前目录下和/xxx/xxx/目录下所有.cpp文件名 $(patsubst %cpp,%o,$(SRCS)) 为替换所有的cpp为o
例子3
AppName = libadapter.so SRCS=$(wildcard ./*.cpp) OBJS = $(SRCS:.cpp=.o) SFLAGS = -shared -luuid /opt/DZWDSJ/VRV/lib/vrvlib/libEncryptlib.so FFLAGS = -fPIC CFLAGS = -O2 -g -c CC = g++ $(AppName) : $(OBJS) $(CC) $^ $(SFLAGS) $(FFLAGS) -o $@ %.o : %.cpp $(CC) $(FFLAGS) $(CFLAGS) $^ -o $@ clean: rm -f $(AppName) $(OBJS)
坚持就是胜利