首页 > 其他分享 >Makefile编写模板 & 学习笔记

Makefile编写模板 & 学习笔记

时间:2023-06-17 22:47:08浏览次数:48  
标签:++ Makefile 笔记 目标 test cpp main 模板

一、模板

# 伪命令
.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,笔记,目标,test,cpp,main,模板
From: https://www.cnblogs.com/shiyixirui/p/17488412.html

相关文章

  • Weekly Report Template Duplicator - 周报模板复制器
    下面是周报模板复制/生成器代码:##WeeklyReportGenerator####ByAlexanderEzharjan#####Configs###template_file='template.docx'week_start=(2023,6,19)week_end=(2023,6,25)fin_date_tag="number:YOUR_STAFF_ID)"#落款时间标记########......
  • java web模板学习
    经过建民老师几次测验我发现我是真写不完那个web系统项目,然后如果真的打分的话,不会很高。所以接下来时间我要学习一些javaweb模板。这个模板吧主要是基于springboot的系统模板。我学习一下,等下次测验就可以快点。......
  • 计算机底层的秘密读书笔记之三
    计算机底层的秘密读书笔记之三IO部分之一我感觉IO应该是最可能给人说明白的一个部分了.也是我这种菜鸟改善应用性能最可能的部分了.CPU内存和cache很难有优化的空间.除非是开发去改垃圾代码.后者是升级硬件.但是IO部分我感觉是有很大的优化空间的.1.IO多路复用.因为......
  • ESP32-C3 JTAG调试笔记
    ESP32-C3JTAG调试笔记ESP32-C3内置了JTAG调试网上对此教程文章较少,记录一下实现过程JTAG调试配置ESP32-C3内置JTAG接口ESP32-C3内置JTAG电路,无需任何额外芯片即可调试。只需要一根连接到D+/D-引脚的USB电缆。配置硬件ESP32-C3针脚USB信号GPIO18D-......
  • RPC概念学习笔记
    RPC是是什么Remoteprocedurecall-远程过程调用对应与本地过程调用也就是本地方法调用它本身并不是一个具体的协议,而是一种调用方式。TCP粘包什么是粘包:TCP面向字节流,没有内容分割符,可能将两条消息同时从缓存区读出来.发送两条消息1:这是李东2:**亚**健康终结者.接收端可......
  • opencv 模板匹配
    -逐个比较像素点之间差异importcv2importnumpyasnpimg=cv2.imread('C:/Users/59925/Desktop/pytest/pics/minions-s.jpg',0)#把图片读取成灰度图template=cv2.imread('C:/Users/59925/Desktop/pytest/pics/eye.jpg',0)#把图片读取成灰度图method='cv2.TM_SQDIFF_NORMED&......
  • Nginx 学习笔记
    概述Nginx是一个高性能的HTTP和反向代理服务器,特点是占用内存少,并发能力强1.正向代理如果把局域网外的Internet想象成一个巨大的资源库,则局域网中的客户端要访问Internet,需要通过代理服务器来访问,这种访问就称为正向代理2.反向代理客户端对代理是无感知的,因为客户端......
  • 思科笔记:OSPF的七类LSA
    LSA类型1:RouterLSA每一个运行OSPF的路由器都会产生1类LSA这里包含宣告进OSPF的本地直连网段的信息通过IP前缀和链路类型来标识链路通过始发路由器ID来标识LSA只在本区域泛洪;无法穿越ABRLinkID是通告该LSA的路由器RIDLSA类型2.NetworkLSA只产生在广播网络和NBMA网络......
  • Java官方笔记11包
    PackagesDefinition:Apackageisagroupingofrelatedtypesprovidingaccessprotectionandnamespacemanagement.Notethattypesreferstoclasses,interfaces,enumerations,andannotationtypes.Enumerationsandannotationtypesarespecialkindsof......
  • SpringBoot学习笔记
    新建SpringBoot项目阿里云地址:https://start.aliyun.com异常消息处理//1.自定义异常类,继承RuntimeExceptionpublicclassMyExceptionextendsRuntimeException{publicMyException(){}}//2.定义全局异常类@RestControllerAdvicepublicclassGloabExcept......