android.mk 详解 其他makefile文件类似

来源:互联网 发布:大数据营销案例ppt 编辑:程序博客网 时间:2024/06/07 12:05


关于libs文件夹和obj文件夹

obj下的是带符号和调试信息的,所以就大很多,静态库也在这个里面。
lib下的是就去去掉这些庞大信息后的库文件,而且是动态链接的库。


方便在Android.mk中定义自己的变量,我们建议使用MY_前缀


一、单个android.mk文件

LOCAL_PATH := $(call my-dir)   
提示当前文件的路径,必须定义在文件开头
 my-dir 返回当前Android.mk所在的目录路径。

include $(CLEAR_VARS)
清除一些变量的值,但是LOCAL_PATH除外

LOCAL_MODULE
指定当前待编译模块名字,名字必须唯一,且不能含有空格,必须定义在
$(BUILD_XXXX)前面.
LOCAL_SRC_FILES:= foo.c \
toto/bar.c \
bar.c.arm
指定参与编译的源代码文件,路径是相对于LOCAL_PATH
bar.c.arm 这样就告诉系统总是将bar.c以arm (32位 )的模式编译
这个斜杠 \ 表示这一行与下一行连在一起,tmd,害的老子编译半天

LOCAL_CPP_EXTENTION := .cxx
这是一个可选变量,用来指定C++代码文件的扩展名,默认是'.cpp',但是你可以改变为
.cxx

LOCAL_ARM_MODE: = arm
默认情况下,arm目标二进制会以thumb的形式生成(16位),如果你希望你的module是
以32位指令的形式,你可以通过设置这个变量为arm。

include $(BUILD_STATIC_LIBRARY)
是用来指示将当前模块编译为静态库的,前缀为.a,后缀为.a。

include $(BUILD_SHARED_LIBRARY)
是用来指示将当前模块编译为共享库,前缀为lib,后缀为.so。

include $(BUILD_EXECUTABLE)表示编译成可执行程序

二、多个android.mk文件
将对应的模块放置在相应的目录中,在每个目录中定义对应的Android.mk文件(类似于
上面的写法),最后,在根目录放置一个Android.mk文件,内容如下:
 include $(call all-subdir-makefiles) 
只需要这一行就可以了,它的作用就是包含所有子目录中的Android.mk文件
all-subdir-makefiles: 返回一个位于当前'my-dir'路径的子目录列表。例如,看下面
的目录层次:
sources/foo/Android.mk

sources/foo/lib1/Android.mk

sources/foo/lib2/Android.mk    

如果sources/foo/Android.mk包含一行:
include $(call all-subdir-makefiles)    
那么它就会自动包含sources/foo/lib1/Android.mk 和sources/foo/lib2/Android.mk。
在默认情况下,NDK将会只搜 索在sources/*/Android.mk中的文件。

最好不要再一个android.mk中定义多个模块,否则可能出现目录方面的 问题

三、引入第三方库


LOCAL_STATIC_LIBRARIES: 应该链接到这个模块的静态库列表(使用BUILD_STATIC_LIBRARY生成),这仅仅对共享库模块才有意义

LOCAL_SHARED_LIBRARIES: 这个模块在运行时要依赖的共享库模块列表,在链接时需要,在生成文件时嵌入的相应的信息。注意:这不会附加列出的模块到编译图,也就是,你仍然需要在 Application.mk中把它们添加到程序要求的模块中。




LOCAL_CFLAGS := /
-I/home/xuxin/mylib/android-platform_external_libpcap/jni
LOCAL_CFLAGS := 主要是引用外部的C头文件, 在编译C代码文件的时候使用,-I 是头文件的存放路径,如果该头文件和我们自己的源文件放在同一级目录,则不需要配置;

LOCAL_CFLAGS := -D__STDC_CONSTANT_MACROS

-D 表示定义一个宏,类似于#define  __STDC_CONSTANT_MACROS

-Werror是编译警告也作为错误信息


LOCAL_CPPFLAGS与LOCAL_CFLAGS一样,但是对C 和C++ source files都适用


LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog -lpcap -L/home/xuxin/mylib/android-platform_external_libpcap/libs/armeabi
LOCAL_LDLIBS := 是引用外部库文件,-L是指定该lib文件的存放路径
例如,下面将告诉链接器生成的模块要在加载时刻链接到 /system/lib/libz.so   
LOCAL_LDLIBS := -lz

常常需要在自己的C代码里链接第三方提供的库文件,例如以.a文件提供。此时需要修改Android.mk文件来加进需要连接的库。LOCAL_LDLIBS不是做这个的,一个可行的方法是使用LOCAL_LDFLAGS通知编译器。例如

LOCAL_LDFLAGS -L$(LOCAL_PATH) -lxxxx

其中xxxx是被链接模块的名字,不含后缀和前缀lib

注意-L后面使用相对路径似乎不行。

(务必注意参数的顺序)


关于libs文件夹和obj文件夹

obj下的是带符号和调试信息的,所以就大很多。
lib下的是就去去掉这些庞大信息后的动态链接库文件。

原创粉丝点击