Makefile

发布时间 2023-12-15 08:33:34作者: 向往全栈

基础知识

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)))