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)

 

猜你喜欢

转载自www.cnblogs.com/wangjian8888/p/10108849.html