把目录下所有文件都编译的命令。

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)

随机推荐

  1. 剑指offer——面试题23:链表中环的入口节点

    函数: ListNode* MeetingNode(ListNode* pHead) { if(pHead==nullptr) return nullptr; ListNode* quickNode= ...

  2. 小米MIX 3获得ROOT权限的步骤

    小米MIX 3有没有办法开启Root超级权限?大伙都知道,Android设备有Root超级权限,一旦手机开启root相关权限,可以实现更强大的功能,比如大伙部门的营销部门的妹纸,使用一些营销工具都需要 ...

  3. linux 查看进程启动时,用户的工作目录

    在linux下查看进程大家都会想到用 ps -ef|grep XXX可是看到的不是全路径,怎么看全路径呢?每个进程启动之后在 /proc下面有一个于pid对应的路径例如:ps -ef|grep pyt ...

  4. sublime 运行 python

    sublime 中 选择菜单 Tools--> Build System-->New Build System,编辑文件如下: /usr/local/Cellar/python/3.7.0 ...

  5. js面向对象(一)——封装

    想写这个好久了,自己当时理解这个确实费了一番功夫,现在记录一下,哪怕对读者有一点点帮助,我也很开心,看着不爽大胆喷吧,我脸皮可厚了,闲话不说了,进入正题 ----------------------- ...

  6. oracle--dump块信息操作

    01, 查看表 SQL> select * from tab where TNAME='T'; TNAME TABTYPE ----------------------------------- ...

  7. 封装element-ui的dialog组件

    封装组件: <template> <div class="dialog-container"> <el-dialog title="titl ...

  8. spring data jpa关联查询(一对一、一对多、多对多)

    在实际过往的项目中,常用的查询操作有:1.单表查询,2.一对一查询(主表和详情表)3.一对多查询(一张主表,多张子表)4.多对多查询(如权限控制,用户.角色多对多).做个总结,所以废话不多说. 使用i ...

  9. c++ 常用的遍历,删除,分割等等文件处理函数代码实现

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9622851.html 删除文件目录函数: void myDeleteDirectory(CSt ...

  10. document.documentElement和document.body 与document.compatMode的关系

    首先我们看看document.compatMode(兼容模式): document.compatMode它有两种可能的返回值:BackCompat和CSS1Compat, document.compa ...