Makefile和Android.mk的基情

Makefile

Makefile介绍

make 是一个命令工具,它解释 Makefile 中的指令(应该说是规则) 。在 Makefile
文件中描述了整个工程所有文件的编译顺序、编译规则。Makefile 有自己的书写格式、
关键字、函数。像 C 语言有自己的格式、关键字和函数一样。而且在 Makefile 中可以
使用系统 shell 所提供的任何命令来完成想要的工作。Makefile(在其它的系统上可能
是另外的文件名)在绝大多数的 IDE 开发环境中都在使用,已经成为一种工程的编译
方法。

Makefile三要素:目标,依赖,命令

  • 目标:目标分为最终目标(第一行就是最终目标)
  • 依赖: 目标符号”:”后的都是依赖
  • 命令:gcc为命令,他是GNU编译器,用于c/c++等编译

    • GCC最基本的用法是∶gcc [options] [filenames] 其中options就是编译器所需要的参数,filenames给出相关的文件名称。

    • -c,只编译,不链接成为可执行文件,编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件,通常用于编译不包含主程序的子程序文件。

    • -o output_filename,确定输出文件的名称为output_filename,同时这个名称不能和源文件同名。如果不给出这个选项,gcc就给出预设的可执行文件a.out。
#step 1
#myapp:main.o func.o 
#   gcc main.o func.o  -o myapp

#目标:main.o  .o为后缀的文件,是编译后的目标文件;
#依赖:main.c  .c为后缀的文件,C语言源代码文件;
#命令:gcc -c main.c 

#main.o:main.c
#   gcc -c main.c
#func.o:func.c
#   gcc -c plus.c

Makefile变量和简单运算(代码复制自别处)

#变量
#OBJECTS=main.o func.o add.o multi.o

#step 3
#所有.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中间文件
#伪目标
.PHONY:clean
clean:
    rm -f *.o
    rm -f myapp

#递归展开式
#可以引用还没有定义的变量,展开是引用时展开
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

学习小例子


    LOCAL_PATH := $(call my-dir)

   include $(CLEAR_VARS)
#模块名称
   LOCAL_MODULE    := hello-jni
#编译时所需源文件
   LOCAL_SRC_FILES := hello-jni.c
#需要的头文件
   LOCAL_C_INCLUDES += $(LOCAL_PATH)/include/ffmpeg
   include $(BUILD_SHARED_LIBRARY)
  • LOCAL_PATH := $(call my-dir)

    可文件必须首先LOCAL_PATH变量的定义。
    它是用来定位在开发树的源文件。在这个例子中,宏函数“my-dir”,提供的构建系统,用于返回
    当前目录的路径(即包含Android的目录。可文件本身)。

  • include $(CLEAR_VARS)

CLEAR_VARS变量提供的构建系统,指出了一个特殊的GNU Makefile,会清楚很多LOCAL_XXX变量
(例如LOCAL_MODULE,LOCAL_SRC_FILES、LOCAL_STATIC_LIBRARIES等…),除了LOCAL_PATH。这是必要的,因为所有的构建
控制文件解析一个GNU使执行上下文,所有变量都是全局的。

  • LOCAL_MODULE := hello-jni

LOCAL_MODULE变量必须定义来确定每个模块你在Android.mk描述。名称必须独特* *和不包含
任何空间。注意,构建系统将自动添加适当的前缀和后缀生成相应的文件。换句话说,
共享库模块命名“foo”将生成“libfoo.so”。

  • LOCAL_SRC_FILES := hello-jni.c

LOCAL_SRC_FILES变量必须包含将要打包如模块的C/C++ 源码。不必列出头文件,build System 会自动帮我们找出依赖文件。
缺省的C++源码的扩展名为.cpp. 也可以修改,通过LOCAL_CPP_EXTENSION。

  • include $(BUILD_SHARED_LIBRARY)

BUILD_SHARED_LIBRARY:是Build System提供的一个变量,指向一个GNU Makefile Script。它负责收集自从上次调用 include $(CLEAR_VARS) 后的所有LOCAL_XXX信息。并决定编译为什么。

BUILD_STATIC_LIBRARY:编译为静态库。

BUILD_SHARED_LIBRARY :编译为动态库

BUILD_EXECUTABLE:编译为Native C可执行程序

授人以渔

关于Android.mk,我只是小作介绍
如果英文尚可,请直接翻阅,理解,继续学习.
http://android.mk/
另外,也可在ndk目录下寻找官方文档
例如 E:\android-ndk-r9d\docs中
Makefile语法介绍相关文档可百度

参考

http://blog.sina.com.cn/s/blog_602f8770010148ce.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值