Makefile了解Android.mk

来源:互联网 发布:淘宝香港代购好的店铺 编辑:程序博客网 时间:2024/06/06 09:27

Maven、ANT、Gradle构建工具
Makefile 构建工具,只需通过make一句命令就可以构建一个可执行程序
为什么要写Makefile文件?
1.当项目非常庞大时,让构建过程,自动化,简单
2.依赖文件比目标更新,会重建目标文件

gcc编译工具,类似于javac
gcc -c a.c把a.c编译成目标文件a.o

#三要素#目标,依赖,命令#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#step 2#变量#OBJECTS=main.o plus.o minus.o multi.o divi.o#step 3#wildcard所有当前目录下.c源文件SOURCES=$(wildcard *.c)#把.c后缀,替换成.o后缀OBJECTS=$(patsubst %.c,%.o,$(SOURCES))myapp:$(OBJECTS)#自动化变量 $^表示所有依赖,$@表示目标    gcc $^ -o $@#通配符#main.o:main.c%.o:%.c#gcc -c main.c -o main.o    gcc -c $^ -o $@#没有依赖#clean清除所有的.o中间文件#伪目标保证了在当前文件夹有clen文件不会报错.PHONY:cleanclean:    rm -f *.o    rm -f myapp#递归展开式#可以引用还没有定义的变量,展开是引用时展开,可以先引用后定义str2=$(str1)str1=hello#直接展开式#必须引用定义好了的变量,定义之后就会展开,先定义后引用str3 := androidstr4 := $(str3)str5 := $(str1) world#变量的值追加str5 += hello#自定义函数myfun=$2 $1#变量等于函数的执行结构myfun_ret=$(call myfun,20,10)#@echo 不加@执行make test时会输出echo 。。。加上@只会输出后面的结果而不输出echotest:    @echo $(SOURCES)    @echo $(OBJECTS)    @echo $(str2)    @echo $(str4)    @echo $(str5)    @echo $(myfun_ret)    @echo $(call myfun,30,40)

plus.c
minus.c
multi.c
divi.c
main.c

.c -> .o目标文件
.o -> 打包myapp,可执行文件

直接make,构建的是终极目标
构建非终极目标,make main.o

调用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 编译需要的动态库

原创粉丝点击