Makefile编写模板 & 学习笔记
一、模板
# 伪命令 .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官方编写文档
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2022-06-17 记录C++,读文件返回base64数据
2022-06-17 记录C++,base64解码写PDF文件遇到的坑