makefile

Makefile 构建工具,只需通过make一句命令就可以构建一个可执行程序

在很多C/C++开源项目中,configrue文件用来检查系统配置生成配置文件(这些配置文件会在接下来的Makefile文件中被使用到)
Makefile文件用来生成我们需要的动态库文件。

画图表示:


image.png
image.png

为什么要写Makefile文件?
1.当项目非常庞大时,让构建过程,自动化,简单。
2.依赖文件比目标更新,会重建目标文件(根据文件的修改时间判断)。

makefile的三部分:目标、依赖、命令

#myapp目标(最终目标,第一行是最终目标)
#:后的文件,这些都是依赖
#命令TAB键开头,如何由依赖文件得到目标
#step 1
myapp:main.o plus.o minus.o multi.o divi.o
    gcc main.o plus.o minus.o multi.o divi.o -o myapp

#目标:main.o
#依赖:main.c
#命令:gcc -c main.c
main.o:main.c
    gcc -c main.c
plus.o:plus.c
    gcc -c plus.c
minus.o:minus.c
    gcc -c minus.c
multi.o:multi.c
    gcc -c multi.c
divi.o:divi.c
    gcc -c divi.c

直接make,构建的是终极目标
构建非终极目标,make xxx.o
当目录下有和命令同名的文件时,需要使用伪目标

#没有依赖
#clean清除所有的.o中间文件
#伪目标
.PHONY:clean
clean:
    rm -f *.o
    rm -f myapp

批量编译

OBJECTS=main.o plus.o minus.o multi.o divi.o
myapp:$(OBJECTS)
#自动化变量 $^表示所有依赖,$@表示目标
    gcc $^ -o $@

通配符,变量展开方式,变量追加。(递归展开,变量可变,直接展开,变量不可变。)

SOURCES=$(wildcard *.c)
#把.c后缀,替换成.o后缀
OBJECTS=$(patsubst %.c,%.o,$(SOURCES))

myapp:$(OBJECTS)
#自动化变量 $^表示所有依赖,$@表示目标
    gcc $^ -o $@
#递归展开式
#可以引用还没有定义的变量,展开是引用时展开
str2=$(str1)
str1=hello

#直接展开式
#必须引用定义好了的变量,定义之后就会展开
str3 := android
str4 := $(str3)
str5 := $(str1) world

#变量的值追加
str5 += hello

#自定义函数
myfun=$2 $1
#变量等于函数的执行结构
myfun_ret=$(call myfun,20,10)

test:
    @echo $(SOURCES)
    @echo $(OBJECTS)
    @echo $(str2)
    @echo $(str4)
    @echo $(str5)
    @echo $(myfun_ret)
    @echo $(call myfun,30,40)

Android.mk注释

#调用my-dir函数,返回Android.mk文件所在的目录
LOCAL_PATH := $(call my-dir) //放在第一行,地址当前所在目录
#include file Makefile可以引入其他的Makefile文件
include $(CLEAR_VARS) //编译模块时,清空LOCAL_MODULE等参数
LOCAL_MODULE ///模块名称
LOCAL_SRC_FILES //编译需要的源文件
LOCAL_C_INCLUDES// 需要的头文件


LOCAL_SHARED_LIBRARIES //编译需要的动态库
LOCAL_STATIC_LIBRARIES //编译需要的静态库
// 会生成依赖关系,当库不存在时会去编译这个库。

LOCAL_LDLIBS 
//链接的库不产生依赖关系,一般用于不需要重新编译的库,如库不存在,则会报错找不到。
//且貌似只能链接那些存在于系统目录下本模块需要连接的库。
//如果某一个库既有动态库又有静态库,那么在默认情况下是链接的动态库而非静态库

LOCAL_LDFLAGS
//这个编译变量传递给链接器一个一些额外的参数。
//比如想传递而外的库和库路径给ld,或者传递给ld linker的一些链接参数,
//-On,-EL{B}(大小端字节序),那么就要加到这个上面,如:
LOCAL_LDFLAGS += -L$(LOCAL_PATH)/lib/ -lHWRecog -O2
//或者直接加上绝对路径库的全名:LOCAL_LDFLAGS += $(LOCAL_PATH)/lib/libHWrecog.a –EB{EL} –O{n}

你可能感兴趣的:(makefile)