一、模板
# 伪命令 .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