一、模板

# 伪命令
.PHONY: clean compileSo compileExe run: compileExe
@./main compileExe: compileSo
@g++ main.cpp -Llib -lsoowCapture -lcamapi -lpthread =lImageProc -ljpeg -lhv_static -o main compileSo:
@g++ fPIC -shared soowCapture.cpp -Iinclude -o libsoowCapture.so -std=c++11
@cp libsoowCapture lib/ clean:
@rm -rf main
@rm -rf libsoowCapture.so
@rm -rf lib/libsoowCapture.so

二、学习笔记

2.1 Makefile基本语法

[目标]: [依赖]
[命令]
  目标:一般是指要编译的目标,也可以是一个动作
  依赖:指执行当前目标所要依赖的先项,包括其他目标,某个具体文件或库等。一个目标可以有多个依赖
  命令:该目标下要执行的具体命令,可以没有,也可以有多条,每条命令一行。命令前面需要按tab键,四个空格
 
2.2 make命令常用选项
make [-f file][options][target]

-f 可以指定Makefile文件的名称
-v 显示版本号
-n 只输出命令,但不执行
-s 只执行,但不显示具体命令,可在命令中用@抑制符号输出
-w 显示执行前执行后的路径
-C dir 指定Makefile所在的目录

2.3 g++编译流程详解

g++ -Istdc++ main.cpp  直接从源码到执行文件

把过程拆分
预处理 g++ -E main.cpp >main.ii
编译 g++ -S main.ii
汇编 g++ -c main.s
链接 g++ -Istdc++ main.o

2.4 Makefile变量

系统变量
$* 不包括扩展名的目标文件名称
$+ 所有的依赖文件,以空格分隔
$< 表示规则中的第一个条件
$? 所有时间戳比目标文件晚的依赖文件,以空格分隔
$@ 目标文件的完整名称
$^ 所有不重复的依赖文件,以空格分隔
$% 如果目标是归档成员,则该变量表示目标的归档成员名称
系统常量
AS 汇编程序的名称,默认 as
CC c编译器名称,默认cc
CPP C预编译器名称,默认cc -E
CXX C++编译器名称,默认g++
RM 问加你删除程序别名,默认rm -f
自定义变量
定义:变量名=变量值
使用:$(变量名) || ${变量名} 例:
cpp := src/main.cpp
obj := objs/main.o compile : $(obj)
$(obj) : $(cpp)
@g++ -c $(cpp) -o $(obj)

2.5 伪命令和模式匹配

伪目标 .PHONY: clean
声明目标为伪目标后,Makefile将不会判断目标是否存在或该目标是否需要更新
模式匹配
%.o: %.cpp .o依赖于对应的.cpp
wildcard $(wildcard ./*.cpp)获取当前目录下的所有cpp文件
patsubst $(patsubst %.cpp, %.o, ./*.cpp) 将对应的cpp文件名替换成.o文件名

2.6 Makefile编译动态库 之 参数详解

-fpic   产生位置无关的代码
-shared 共享
-l(小L) 指定动态库
-I(大i) 指定头文件目录,默认当前目录
-L 手动指定库文件搜索目录,默认只连接共享目录 生成动态库
g++ -fpic -shared a.cpp -o liba.so 编译程序,链接so
g++ main.cpp -L./ -la -o main 或者 g++ -o main main.cpp liba.so 找不到so库,参考:https://www.cnblogs.com/shiyixirui/p/17488353.html

2.7 Makefile中执行shell命令

# 先定义成变量,然后命令使用 echo 来输出/执行
a = $(shell pwd) runShell:
@echo $(a)

2.8 Makefile中的 if 判断

ifeq        判断是否相等
ifneq 判断是否不相等
ifdef 判断变量是否存在
ifndef 判断变量是否不存在
test1=123
test2=1 ifeq ($(test1),123)
test2=yes
else
test2=no
endif .PHONY: test
test:
@echo $(test2)

2.9 Makefile中的循环

# 举例,生成4个文件:1.txt  2.txt  3.txt
test_list=1 2 3
.PHONY: test
test:
touch $(foreach v, $(test_list), $v.txt)

2.10 Makefile中自定义函数

# 不带参数
define myfunc
@echo 123456
endef # 带参数
define mufunc1
@echo 123 $(1)
endef .PHONY: test
test:
$(call myfunc)
$(call myfunc1, heihei)

其他功能,请参考Makefile官方编写文档

Makefile编写模板 & 学习笔记的更多相关文章

  1. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  2. Makefile的简单编写【学习笔记】

    首先我们先创建两个简单的文件: main.c #include <stdio.h> extern void hi_fun(); int main() { printf("hell ...

  3. Linux 我的第一个makefile(Linux指令学习笔记)

    我的第一个makefile 最近学到了makefile的文件的编写.makefile是一个能达到方便编译链接生成目标程序的文件, make确实很方便,在写makefile的过程也能更好的理解gcc编译 ...

  4. C++模板学习笔记

    一个有趣的东西:实现一个函数print, 输入一个数组, 输出数组的各个维度长度. eg. ], b[][], c[][][]; print(a); //(2, 4) print(b); //(3, ...

  5. 《C++ Primer Plus》14.4 类模板 学习笔记

    14.4.1 定义类模板下面以第10章的Stack类为基础来建立模板.原来的类声明如下:typedef unsigned long Item; class Stack{private:    enum ...

  6. 初步C++类模板学习笔记

    类模板 实现:在上课时间的定义给它的一个或多个参数,这些参数代表了不同的数据类型.                              -->抽象的类. 在调用类模板时, 指定參数, 由编 ...

  7. tornada模板学习笔记

    import tornado.web import tornado.httpserver import tornado.ioloop import tornado.options import os. ...

  8. jTemplates模板学习笔记

    1.jTemplates工作方式   1)setTemplateElement:指定可处理的模板对象 2)processTemplate:对模板化的对象进行数据处理 2.语法解析   1)jTempl ...

  9. bzoj 2618 半平面交模板+学习笔记

    题目大意 给你n个凸多边形,求多边形的交的面积 分析 题意\(=\)给你一堆边,让你求半平面交的面积 做法 半平面交模板 1.定义半平面为向量的左侧 2.将所有向量的起点放到一个中心,以中心参照进行逆 ...

  10. jmeter__编写脚本学习笔记、备忘

    web持续添加 前言: 1. token就是令牌,比如你授权(登录)一个程序时,他就是个依据,判断你是否已经授权该软件:也叫关联 2. cookie就是写在客户端的一个txt文件,里面包括你登录信息之 ...

随机推荐

  1. JAVA对象的生命周期(二)-对象的创建

    目录 对象创建的几种方式 类加载检查. 内存分配 初始化零值 设置对象头 执行init方法 对象创建的几种方式 new clone newInstance 反序列化 String s = " ...

  2. 【Azure 应用服务】Function App / App Service 连接 Blob 报错

    问题描述 因 Blob 启用了防火墙功能,但是当把App Service 或 Function App的出站IP地址都加入到Blob的白名单中,为什么访问还是403错误呢? 问题解答 Azure St ...

  3. 一次生产环境OOM排查

    一.背景 前几天下午飞书告警群里报起了java.lang.OutOfMemoryError: unable to create new native thread告警,看见后艾特了对应的项目负责人但是 ...

  4. stm32OLED多级菜单

    今天实现了OLED多级菜单的显示.我用的是stm32f103ve,和四脚的OLED屏幕,用了三个按键. 话不多说,直接上代码. 点击查看代码 //先定义按键功能结构体 typedef struct { ...

  5. 网络流与各种建模(I)

    网络流与各种建模(I) 网络流基础 这里默认读者学习过网络流和MCMF,这里仅作复习 网络流解决的问题是给一个源点和汇点,每个边有最大流量,最大化从源点放水到汇点的速率. 网络流的时间复杂度是 \(O ...

  6. Linux环境下动态库的生成与使用

    一.动态库的生成 定义 a.h.a.c 如下: a.h #include <stdio.h> #include <stdlib.h> void FuncA(); a.c #in ...

  7. CSAPP:lab7 shell

    实验网站 课程网站:CSAPP 源码下载 源码下载 实验文档下载 我的实验环境:Ubuntu 20.04 lab7文档解读 ​ 查看 tsh.c (tiny shell) 文件,您会看到它包含一个简单 ...

  8. ReACT介绍与llama_index ReActAgent实践

    Agent是大模型的重要应用方向,而ReACT是学术界提出的重要方法,本文介绍ReACT论文,然后通过llama_index ReActAgent来分析ReACT的执行过程. ReACT <RE ...

  9. 基于ads1299神经信号采集之调试总结和备忘

    前记  ads129x系列芯片在生理信号采集这块应用十分广泛,也是一个不可或缺的芯片.最近几个项目用到它,算是从一个陌生到熟悉的过程吧,这个过程踩过不少坑,中间经历过很多比较大的问题困扰和折磨,花费了 ...

  10. 3DCAT首届行业生态交流会|升大科技CEO邱杰:5G云渲染助力企业培训

    2021年12月17日下午,由深圳市瑞云科技有限公司主办,深圳市虚拟现实产业联合会协办的 云XR如何赋能元宇宙--3DCAT实时云渲染首届行业生态合作交流会 圆满落幕 .此次活动围绕"云XR ...