Makefile和Android.mk的基情

来源:互联网 发布:mac装系统开机按哪个键 编辑:程序博客网 时间:2024/06/08 16:04

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: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)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 0
原创粉丝点击