Android.mk语法说明(android ndk开发)(3)

你的module的名字。它必须在所有的module名字中是唯一的,而且不能有空格。你必须在任何一个$(BUILD_XXXX)脚本之前定义它。

module名字决定了生成文件的名字,例如:一个名字为lib<foo>.so的shared library的module名字为<foo>。可是,你应该在你的NDK编译文件中(无论是Android.mk还是 Application.mk)进引用其它module的通用的名字(例如<foo>)。

LOCAL_SRC_FILES

这是一个将用于你的module编译的资源文件列表。只用在列表中的文件才会传递给编译器,因为编译系统自动帮你计算依赖关系。

注意,所有的资源文件名字都是相对于LOCAL_PATH的,你能够使用路径分隔符,例如:

LOCAL_SRC_FILES := foo.c \
                         toto/bar.c

注意:只有使用Unix风格的正斜线(/)在编译文件中才可以,windows风格的反斜线(\)不能被正确处理。

LOCAL_CPP_EXTENSION

这是一个可选择的变量,它能用来定义c++源文件的文件后缀名。默认的是'.cpp',但是你可以改变它。例如:

LOCAL_CPP_EXTENSION := .cxx

LOCAL_C_INCLUDES

一个可选的编译所有源文件(C,C++,汇编)时会添加到include搜索路径相对于NDK *root*文件夹的路径的列表。例如:

LOCAL_C_INCLUDES := sources/foo

或者

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../foo

他们会在LOCAL_CFLAGS / LOCAL_CPPFLAGS中的任何inclusion flag之前被替换。

LOCAL_CFLAGS

当编译 C 和 C++源文件时传递的一组可选的编译器标识。

它可以用来指定额外的宏定义或编译选项。

重要信息:不要在你的Android.mk文件中尝试去改变优化/调试等级,这个可以通过在你的Android.mk文件中指明适当的信息来让系统自动处理,将会使NDK生成在调试中可以使用的有用的数据文件。

注意:在android-ndk-1.5_r1中,对应标记仅能用在c源文件上,不能用在c++源文件上。这能够正确匹配所有的android编译系统行为。(你现在可以使用LOCAL_CPPFLAGS来仅为c++源文件设置标识)。

LOCAL_CXXFLAGS

LOCAL_CPPFLAGS的一个别名。注意,这种标识的使用是过时的,因为在以后的NDK版本中它可能被取消。

LOCAL_CPPFLAGS

当仅编译 C++源文件时传递的一组可选的编译器标识。他们将在LOCAL_CFLAGS之后显示在命令行上。

注意:在android-ndk-1.5_r1中,对应标记在c源文件上和在c++源文件上都能使用。这能够正确匹配所有的android编译系统行为。(你现在可以使用LOCAL_CFLAGS来为c++源文件和c源文件设置标识)。

LOCAL_STATIC_LIBRARIES

将要被链接进这个module的static libraries modules的列表(用BUILD_STATIC_LIBRARY编译过的)。这个仅在shared library modules中能被检测到。

LOCAL_SHARED_LIBRARIES

依赖于运行时的shared libraries *modules*的列表。这在链接时是必要的,为了把对应的信息嵌入到生成的文件中。

注意:他不会把列出的module添加到编译表中,例如:你仍然需要在你的Application.mk文件中把他们添加到你的应用程序需要的module中。

LOCAL_LDLIBS

编译你的module时使用到的额外的链接器标识列表。它能够用一个带 "-l" 前缀的表达式传递一个指明的系统库的名字。例如:下面的定义将会通知编译器在加载的时候生成一个链接到/system/lib/libz.so的module:

LOCAL_LDLIBS := -lz

阅读docs目录下的STABLE-APIS.TXT文档,你将能了解到在这个NDK版本中你可以链接的系统库的列表。

LOCAL_ALLOW_UNDEFINED_SYMBOLS

默认情况下,当尝试编译一个shared library时任何一个没有定义的引用都将产生一个"undefined symbol"错误。这对在你的源代码中捕获bug很有帮助。
可是,如果由于某种原因你需要让这些检查失效,把这个变量设置为'true'。注意,对应的shared library在运行时加载可能出错。

LOCAL_ARM_MODE

默认情况下,ARM的二进制文件将生成每一条指令都是16位的'thumb'模式。你可以定义这个变量为'arm',如果你想强制生成的module目标文件为 'arm'(每条指令32位)模式的。例如:

LOCAL_ARM_MODE := arm

注意,你也可以通过在源文件名后面添加一个'.arm'来指示编译系统只把指定的文件编译'bar.c'。例如:

LOCAL_SRC_FILES := foo.c bar.c.arm

通知编译系统总是把'bar.c'编译成'.arm'模式,而依据LOCAL_ARM_MODE变量的值来编译 foo.c 文件。

注意:在你的Application.mk文件中设置APP_OPTIM为 'debug'也能强制生成ARM二进制文件。这是因为在thumb模式下toolchain debugger 中的bug不能得到较好的处理。

LOCAL_ARM_NEON

把这个变量设置为'true'能够允许你在你的C和C++源码中使用ARM Advanced SIMD(a.k.a. NEON)GCC,也能在汇编文件中使用NEON指令。

你仅仅应该在想要对应ARMv7指令序列的'armeabi-v7a' ABI时定义它。注意,不是所有基于ARMv7的CPU都支持NEON指令序列扩展,你应该开启运行时检查来确保你能安全地使用这些代码在运行期间。更多的关于这些的内容,可以阅读docs目录下的CPU-ARM-NEON.TXT 和CPU-FEATURES.TXT.文档。

二选一,你也可以在指定的文件后面加上'.neon'来指示表仪器把指定的文件编译成NEON支持的文件,例如:

LOCAL_SRC_FILES = foo.c.neon bar.c zoo.c.arm.neon

在这个例子中'foo.c'将被编译成thumb+neon模式,'bar.c'将被编译成'thumb'模式,'zoo.c' 将被编译成'arm+neon'模式。

注意,如果 '.neon' 后缀和'.arm' 后缀都是用,那么 '.neon' 后缀和一定要添加到'.arm' 后缀之后。(例如: foo.c.arm.neon 可以,但是 foo.c.neon.arm 不可以)。

LOCAL_DISABLE_NO_EXECUTE

Android NDK r4添加的用来支持"NX bit"安全特性的。默认情况下是启用的,但是你也可以设置这个变量为 'true'来启用它,如果你真的需要这么做的话。

注意:这个特性不会修改ABI,它仅仅是使内核能够指向ARMv6+ CPU设备。在这种特性下生成的机器码将不需要做修改就能运行在更早的CPU架构上。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwzpjj.html