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

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. [转] linux nc命令

    [From] https://blog.csdn.net/freeking101/article/details/53289198 NC 全名 Netcat (网络刀),作者是 Hobbit & ...

  2. Q481 神奇字符串

    神奇的字符串 S 只包含 '1' 和 '2',并遵守以下规则: 字符串 S 是神奇的,因为串联字符 '1' 和 '2' 的连续出现次数会生成字符串 S 本身. 字符串 S 的前几个元素如下:S = & ...

  3. 剑指offer——面试题18.1:删除链表中重复的节点

    // 面试题18(二):删除链表中重复的结点 // 题目:在一个排序的链表中,如何删除重复的结点?例如,在图3.4(a)中重复 // 结点被删除之后,链表如图3.4(b)所示. #include &l ...

  4. Map.Entry使用详解

    1.Map.Entry说明 Map是java中的接口,Map.Entry是Map的一个内部接口. Map提供了一些常用方法,如keySet().entrySet()等方法,keySet()方法返回值是 ...

  5. java多线程-阻塞队列BlockingQueue

    大纲 BlockingQueue接口 ArrayBlockingQueue 一.BlockingQueue接口 public interface BlockingQueue<E> exte ...

  6. maxscript批量设置摄像机并保存渲染图

    代码可直接运行 fn renderr = ( a=box() --新建一个立方体 ambientcolor = (color ) --设置环境光(搞不太懂,白的不出错就行) to do ( dis = ...

  7. DP Intro - poj 1947 Rebuilding Roads

    算法: dp[i][j]表示以i为根的子树要变成有j个节点的状态需要减掉的边数. 考虑状态转移的时候不考虑i的父亲节点,就当不存在.最后统计最少减去边数的 时候+1. 考虑一个节点时,有两种选择,要么 ...

  8. pip升级最新版本

    1.如果是python2.7输入以下指令 python -m pip install --upgrade pip 2.如果是python 3.+输入以下指令 python3 -m pip instal ...

  9. c#异步编程async await

    可以代替协程了 但是需要.net4 版本 unity2017以上版本可以用了 再也可以不用蛋疼的没有返回值的协程了 //异步编程,和Task一起用 async void TestAsync(){ // ...

  10. SpringMVC的json交互

    一.注解说明 1.@RequestBody  作用:@RequestBody注解用于读取http请求的内容(字符串),通过springmvc提供的HttpMessageConverter接口将读到的内 ...