makefile android,FFmpeg学习系列(五)Makefile与Android.mk

66b52468c121889b900d4956032f1009.png

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

Makefile

Makefile 构建工具,只需通过make一句命令就可以构建一个可执行程序。相当于Maven、ANT、Gradle构建工具。

gcc是一个编译工具,Makefile是一个构建工具,Makefile中会用到gcc。

在Linux中要把test.c得到一个可执行程序,我们需要编译它,通过 gcc -c test.c 编译生成 test.o 目标文件,这个目标文件不能去执行,需要继续执行 gcc -o test test.o 得到test可执行文件 。

在Java中使用ANT得到apk:

java源文件->javac编译(相当于gcc)->class文件->通过ANT打包得到apk

在c中使用gcc得到可执行文件:

.c源文件->gcc编译->.o目标文件->链接得到二进制可执行文件

如图:

shell4.png

Makefile里面就是包含一系列的生成可执行程序的过程。

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

Makefile文件用来生成我们需要的动态库文件(.so)。

为什么要写Makefile文件?

1.当项目非常庞大时,让构建过程,自动化,简单

2.依赖文件比目标更新,会重建目标文件

如何编写一个Makefile

假设一个项目中有

plus.c

minus.c

multi.c

divi.c

main.c五个.c文件。

我们需要:

.c -> .o目标文件

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

开始编写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

#step 2(简写)

#变量

#OBJECTS=main.o plus.o minus.o multi.o divi.o

#step 3(简单明了,最终版本)

#所有.c源文件

SOURCES=$(wildcard *.c)

#把.c后缀,替换成.o后缀即是所有.o文件

OBJECTS=$(patsubst %.c,%.o,$(SOURCES))

myapp:$(OBJECTS)

#自动化变量 $^表示所有依赖,[email protected]

gcc $^ -o $@

#通配符

#main.o:main.c

%.o:%.c

#gcc -c main.c -o main.o

gcc -c $^ -o $@

#没有依赖

#clean清除所有的.o中间文件

#伪目标

.PHONY:clean

clean:

rm -f *.o

rm -f myapp

#---------END-------------

#Makefile中一些变量与函数的书写

#递归展开式

#可以引用还没有定义的变量,展开是引用时展开

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)

Makefile文件编写完成之后直接执行make命令。

直接make,构建的是终极目标

构建非终极目标,make main.o

Android.mk

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值