【MakeFile学习】常用的命令分析

参考: http://blog.sina.com.cn/s/blog_55465b4701017rap.html


最近在学习Andorid下的JNI,常常碰到需要用MakeFile打包的问题,选择了个例子,查询了部分参数,记录一下。

常用的MakeFile文件如下:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
include $(LOCAL_PATH)/../android-config.mk

LOCAL_C_INCLUDES := $(NDK_PROJECT_PATH)/include
LOCAL_C_INCLUDES += $(NDK_PROJECT_PATH)/include/playbook
LOCAL_STATIC_LIBRARIES := libatutil
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := libxmlapi
LOCAL_LDLIBS :=-lz -lm -llog -landroid -lEGL -lGLESv1_CM 
LOCAL_CFLAGS := -DMACOS -DPLAYBOOK -DMACOSX -DNDEBUG -DTIXML_USE_STL -fexceptions
FILE_LIST := $(wildcard $(LOCAL_PATH)/*.cpp)
LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%)

include $(BUILD_STATIC_LIBRARY)

LOCAL_PATH指定了当前的目录, 宏函数‘my-dir’, 由编译系统提供,用于返回当前路径(即包含Android.mk file文件的目录)。

include $( CLEAR_VARS):
CLEAR_VARS由编译系统提供,指定让GNU MAKEFILE为你清除许多LOCAL_XXX变量(例如 LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES, 等等...),除LOCAL_PATH 。这是必要的,因为所有的编译控制文件都在同一个GNU MAKE执行环境中,所有的变量都是全局的。

“include”指示符告诉 make 暂停读取当前的 Makefile,而转去读取“include”指定的一个或者多个文件,完成以后再继续当前 Makefile 的读取;Makefile 中指示符“include”书写在独立的一行;

LOCAL_C_INCLUDES:本次编译需要包含的头文件,一个相对于当前目录可选的路径名单,当编译所有的源文件(C,C++和汇编)时,它将被添加进include搜索路径。

LOCAL_STATIC_LIBRARIES: 静态链接库文件

LOCAL_MODULE_TAGS :=user eng tests optional
user: 指该模块只在user版本下才编译
eng: 指该模块只在eng版本下才编译
tests: 指该模块只在tests版本下才编译
optional:指该模块在所有版本下都编译

LOCAL_MODULE:生成的模块名,这个变量必须定义,表示make后将要生成的文件的名字

LOCAL_LDLIBS:本次编译的链接选项,相当于gcc -l后的参数;z是zip库,EGL、GLESv1_CM、GLESv2是硬件加速动态库/system/lib/egl/libGLES_sxwboy.so中的三个部分。

LOCAL_CFLAGS:同样是编译选项,相当于gcc -O后面的参数

LOCAL_CFLAGS-D,增加全局宏定义。
LOCAL_CFLAGS := -DUSE_JSC相当于在所有源文件中增加一个#define USE_JSC
LOCAL_CFLAGS := -DUSE_COPY_BIT=1相当于在所有源文件中增加一个#define USE_COPY_BIT 1

参考:http://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html

FILE_LIST: 但在变量的定义和函数引用时,通配符将失效。这种情况下如果需要通配符有效,就需要使用函数“wildcard”,它的用法是:$(wildcard PATTERN...) 
一般我们可以使用“$(wildcard *.c)”来获取工作目录下的所有的.c文件列表。

比如:

src=$(wildcard *.c ./sub/*.c)
wildcard把 指定目录 ./ 和 ./sub/ 下的所有后缀是c的文件全部展开。

LOCAL_SRC_FILES:本次需要编译的源文件;

include
include可Android多以这样的形式出现,如:include $( CLEAR_VARS),include $(BUILD_SHARED_LIBRARY).其实这个include可以理解成"执行"的意思,那么执行什么呢?当然是看后边的宏了.
宏CLEAR_VARS已经在3.2节中介绍过了,表示清除一些变量.
宏BUILD_SHARED_LIBRARY表示生成共享库,即生成.so文件
因此include $(BUILD_SHARED_LIBRARY)就是指定在/system/lib/目录下生成一个lib$(LOCAL_MOUDULE).so文件,同样类型的宏如下:
•CLEAR_VARS                               清除LOCAL_xxx变量
•BUILD_SHARED_LIBRARY                     在/system/lib/目录下生成lib$(LOCAL_MOUDULE).so文件
BUILD_STATIC_LIBRARY                      生成lib$(LOCAL_MOUDULE).a文件
•BUILD_EXECUTABLE                         在/system/bin/目录下生成可执行文件
BUILD_PACKAGE                             编译成一个apk文件

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值