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)
随机推荐
- NOI Linux学习
打开终端: cd (目录名)//进入该目录的终端 cd ..//退出该目录,返回上一层. 修改用户名 密码: 修改密码: passwd//直接修改root密码 passwd (用户名)//修改该用户的 ...
- Android Studio Gradle下载的包在哪里?
C:\Users\Administrator\.gradle\caches\modules-2\files-2.1
- centos 7 设置开机启动服务
2018-12-25 Centos7下添加开机自启动脚本和服务的方法 以docker 服务为例 1.centos7自带命令设置 systemctl enable docker.service 2.设置 ...
- 2017 FVDI2 ABRITES Commander with 18 Softwares FULL Version + FLY OBD Terminator + J2534 DrewTech Softwares
Highlights of FVDI2 Abrites Commander Full Version: 1.Free update online. 2.This is full version FVD ...
- javascrpit sort()数组对象中排序
/*ionic 调用 * @param attr 排序的属性 如number属性 * @param rev true表示升序排列,false降序排序 * */ commonSortMethod(att ...
- 003-BootStrap完整模板
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8& ...
- mongodb3.4 远程连接认证失败
mongodb开启或者关闭授权功能时还是挺麻烦的,需要新建服务键入mongod --auth.为了方便,我这里是建了两个服务,用到哪个就切换至哪个服务. --需要授权 mongod --logpath ...
- Spring Session解决分布式Session问题的实现原理
使用Spring Session和Redis解决分布式Session跨域共享问题 上一篇介绍了如何使用spring Session和Redis解决分布式Session跨域共享问题,介绍了一个简单的案例 ...
- css3画半圆
border-radius制作半圆与制作圆形的方法是一样的,只是元素的宽度与圆角方位要配合一致,不同的宽度和高度比例,以及圆角方位,可以制作上半圆.下半圆.左半圆和右半圆效果.例如:.semicirc ...
- Zato入门part2
Zato入门part1 参考1 前提:从part已经建立了集群.服务框架并成功的调用了服务.现在我们通过HTTP.ZeroMQ和JSON使用外部服务. 除非坚持手工调用,否则服务从来不知道什么确切的U ...