基础知识
g++ -c *.cpp -o *.o -I/usr/include -IXXXXX
编译静态库:
ar -r [lib.a] [test.o] [test1.o]
gcc -c test.c lib.a -o kezhixingwenjian
编译动态库:
gcc -c fpic add.c minus.c
gcc -shared add.o minus.o dongtaiku.so
gcc main.c -o exec -Ioperation -L xxxxx.so
makefile基础:
$@ 目标target的完整名称
$< 第一个依赖文件的名称
$^ 所有的依赖文件,以空格分开,不包含重复的文件。
debug :
@echo hello
//@的作用是为了不让控制台输出 echo hello 本身。
clean :
@rm -rf objs
debug :
@echo hello
.PHONY : clean debug // 为了防止目录下有clean debug 这个文件
1、变量在声明的时候要给初始值,使用要$()
cpp := src/main.cpp
obj := objs/main.o
$(obj) : ${cpp}
g++ -c $(cpp) -o $(obj)
compile : $(obj)
2、变量的赋值
如果使用=进行赋值可以更改
:= 进行赋值不能进行更改
?= 如果进行赋值,之前被赋值了的话不会再进行赋值。
+= 略
函数使用基础知识
$(fn,arguments) or ${fn,argument}
1、shell命令
cpp_srcs := $(shell find src -name *.cpp)
debug :
@echo $(cpp_srcs)
2、subst命令
objs/main.o : src/main.cpp
@g++ -c $< -o $@
cpp_srcs := $(shell find src -name *.cpp)
cpp_objs := $(subst src/,objs/,$(cpp_srcs))
debug :
@echo $(cpp_srcs)
3、patsubst
cpp_objs := $(patsubst src/%.cpp,objs/%.o,$(cpp_srcs))
4、foreach函数
include_paths := /usr/include \
/usr/include/opencv2/core
include_paths := $(foreach ,$(include_paths),-I$(item))
I_flag := $(include_paths:%=-I%)
5、dir文件
cpp_srcs := $(shell find src -name *.cpp)
cpp_objs := $(patsubst src/%.cpp,objs/%.o,$(cpp_srcs))
objs/%.o: src/%.cpp
@mkdir -p $(dir $@)
@g++ -c $^ -o $@
compile : $(cpp_objs)
6、notdir函数
libs := $(notdir $(shell find /usr/lib -name lib*))
7、filter函数
a_libs := $(filter %.a ,$(libs))
so_libs := $(filter %.so ,$(libs))
8、basename函数(取消后缀)
so_libs := $(basename $(filter %.so ,$(libs)))