• 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)

     

  • 相关阅读:
    Windows下的符号链接
    简单谈谈存储器的容量缩水问题
    配置CKEditor和CKFinder
    CKFinder的水印控件的问题
    关于 Visual Studio 默认创建的不是公共类
    Symbian 60 按键以及对应的键值(图)
    PLC中存储器的数据类型与寻址方式
    S7200 寻址
    电工识图笔记
    S7200型号串口通信参数设置
  • 原文地址:https://www.cnblogs.com/whwywzhj/p/10108849.html
Copyright © 2020-2023  润新知