关键词不能为空

当前您在: 主页 > 英语 >

Android.mk的文件语法规范

作者:高考题库网
来源:https://www.bjmy2z.cn/gaokao
2021-02-07 13:32
tags:

-

2021年2月7日发(作者:buy)


Introduction:





编译文件是用来向


Android N DK


描述你的


C,C++


源代码文件的 ,



这篇文档描


述了它的语法。在阅读 下面的内容之前,假定你已经阅读了


docs/


文件,了解


了它们的脚色和用途。





一、概述





一个


file


用来向编译系统描述你的源代码。具体来说:





(1)


该文件是


GNU Makefile


的 一小部分,会被编译系统解析一次或更多次的


build


系统。





因此, 您应尽量减少您声明的变量,不要认为某些变量在解析过程中不会被定义。





(2)


这个文件的语法允许把你的源代码组织成模块,一个模块属下列类型之一:





1)


静态库



2)


共享库,


且只有共享库将被安装


/


复 制到您的应用软件包,


虽然静态库能被用


于生成共享库。





你可以在每一个


file


中定义一个 或多个模块,你也可以在几个模块中使用同一


个源代码文件。





(1)


编译系统为你处理许多细节问题。例如,你不需要在你的



中列出 头文件和


依赖文件。


NDK


编译系统将 会为你自动处理这些问题。这也意味着,在升级


NDK


后,你应 该


得到新的



toolchain/p latform


支持,而且不需要改变你的


文件。




注意,这个语法同公开发布的


Android


平台的开源代 码很接近,然而编译系统实现他们的


方式却是不同的,这是故意这样设计的,可以让程序 开发人员重用外部库的源代码更容易。





在描述语法细节之前,咱们来看一个简单的

< br>


的例子,比如,下面的文件:





sources/helloworld/helloworld.c




sources/helloworld/




'helloworld.c'


是一 个


JNI


共享库,实现返回


< p>
字符串的原生方法。相应的



文件会象下面这样:< /p>





LOCAL_PATH := $$(call my-dir)




include $$(CLEAR_VARS)




LOCAL_MODULE:= helloworld




LOCAL_SRC_FILES := helloworld.c




include $$(BUILD_SHARED_LIBRARY)




好,我们来解释一下这几行代码:





LOCAL_PATH := $$(call my- dir)




一个


file


首先必须定义好


LOCAL_PATH


变量。


它用于在开发树 中查找源文件。


在这个例子中,


宏函数


?my


-


dir?,


由编译系统提供 ,


用于返回当前路径


(


即包含


file



件的目录


)






include $$( CLEAR_VARS)




CLEAR_VARS


由编译系统提 供,指定让


GNU MAKEFILE


为你清除许多

< p>
LOCAL_XXX




(


例如



LOCAL_MODULE,



LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES,


等等


.. .)




LOCAL_PATH



这是必要的,


因为所有的编译控制文件都 在同一个


GNU MAKE


执行环境中,所有的变量都是全局的。






LOCAL_MODULE := helloworld




LOCAL_MODULE


变量必须 定义,以标识你在




文件中描述的每个 模块。名称


必须是唯一的,


而且不包含任何空格。


注意编译系统会自动产生合适的前缀和后缀,


换句话说,

一个被命名为


'foo'


的共享库模块,将会生成


''


文件。





重要注意事项:


如果你把库命名为< /p>


?libhelloworld?



编译 系统将不会添加任何的


lib


前缀,



会生成



,这是为了支持来源于


Android


平台的源代码的



文件,如果


你确实需要这么做的话。





LOCAL_SRC_FILES := helloworld.c




LOCAL_SRC_FILES


变量必须包含将要编译打包进模块中的


C



C++


源代码文件。注 意,


你不用在这里列出头文件和包含文件,


因为编译系统将会自 动为你找出依赖型的文件


;


仅仅列出


直 接传递给编译器的源代码文件就好。【注意,默认的


C++


源码 文件的扩展名是


?.cpp?.


指定一


个不同的扩展名也是可能的,只要定义


LOCAL_DEFAULT_CPP_EXT ENSION


变量,不要忘记


开始的小圆点

(


也就是定义为



?.cxx?,


而不是


?cxx?)(


当然这一步我们 一般不会去改它


)






include $$(BUILD_SHARED_LIBRARY)




BUILD_SHARED_LIBRARY


是编译系统提供的变量 ,


指向一个


GNU Makefile


脚本


(


应该就


是在

build/core


目录下的


shared_)


,负责收集自从上次调用


'include $$(CLEAR_VAR S)'


以来,定义在


LOCAL_XXX


变量中的所有信息,并且决定编译什么,如何正确地去做。并根据


其规则生成静态库。 同理对于静态库。






sources/samples


目录下有更复杂 一点的例子,


写有注释的



文件,


你可以看看。





二、参考





这是一份你应该在



中依赖或定义的变量 列表,


您可以定义其他变量为自己使用,


但是

< br>NDK


编译系统保留下列变量名:





-



LOCAL_


开头的名字


(


例如



LOCAL_MODULE)




-



PRIVATE_, NDK_ or APP_


开头的名字


(


内部使用


)




-< /p>


小写名字


(


内部使用,例如


?my


-


dir?)





如果您为了方便在



中定义自己的变量,


我们建议使用

MY_


前缀,


一个小例子:





MY_SOURCES := foo.c




ifneq ($$(MY_CONFIG_BAR),)endif





LOCAL_SRC_FILES += $$(MY_SOURCES)




1. GNU Make


变量





这些


GNU Make


变量在你的< /p>



文件解析之前,就由编译系统定义好了。注意在

< br>某些情况下,


NDK


可能分析


< /p>


几次,每一次某些变量的定义会有不同。





(1) CLEAR_VARS:


指向一个编译脚本,几乎所有未定义的


LOCAL_XXX


变量都在



节中列出。你必须在开始一个新模 块之前包含这个脚本。


include


$$(CLEAR_VARS)




(2) BUILD_SHARED_LIBRARY:


指向 编译脚本,收集所有的你在


LOCAL_XXX


变量中提


供的信息,并且决定如何把你列出的源代码文件编译成一个共享库。注意,你必须至少在包含< /p>


这个文件之前定义


LOCAL_MODULE


LOCAL_SRC_FILES


,使用例子:





include $$(BUILD_SHARED_LIBRARY) (


注意这将生成一个名为


lib$$(LOCAL_MODULE).so


的文件

< br>)




(3) BUILD_STATIC_LIBRARY:


一个


BUIL D_SHARED_LIBRARY


变量用于编译一个静态


库。 静态库不会复制到你的


project/packages


中, 但是能够用于编译共享库,


(


看下面描述的

LOCAL_STATIC_LIBRARIES and LOCAL_STATIC_WHOLE_LIBRARIES)





使用例子:


include $$(BUILD_STATIC_LIBRARY) (


注意,这将会生成一个名为


lib$$(LOCAL_MODULE).a


的文件


)






(4) TARGET_ARCH:


目标


CPU


平台的名字


,



android


开放源码中指定的那样。


如果是


arm



表 示要生成


ARM


兼容的指令,与


CPU


架构的修订版无关。





(5) TARGET_PLATFORM:


解析的时候,目标


Android


平台的名字


.


详情可参考


/development/n dk/docs/stable- .




android-3 -> Official Android 1.5 system images




android-4 -> Official Android 1.6 system images




android-5 -> Official Android 2.0 system images




(6) TARGET_ARCH_ABI:


暂时只支持两个


value



armeabi



armeabi-v7a


。在现在的版本


中一般把这两个值简单的定义为


arm


,< /p>


通过


android


平台内部对它重定 义来获得更好的匹配。



他的


ABI< /p>


将在以后的


NDK


版本中介绍,它们会有 不同的名字。注意所有基于


ARM



A BI



会把



'TARGET_ARCH'


定义成


?arm?


,但是会有不同的


?TARGET_ARCH_ABI?





(7) TARGET_ABI:


目标平台和


ABI

< br>的组合,它事实上被定义成


$$(TARGET_PLATFORM)-$$(TAR GET_ARCH_ABI)


在你想要在真实的设备中针对一个特别的


目标系统进行测试时,会有用。在默认的情况下,它会是


'android-3 -arm'




2.


模块描述变量





下面的变量用于向编译系统描述你的模块。你应该定义在


'include $$(CLEAR_VARS)'



'include $$(BU ILD_XXXXX)'


之间。正如前面描写的那样,


$$(CL EAR_VARS


是一个脚本,清除所


有这些变量,除非在描述 中显式注明。





(1) LOCAL_PATH:


这个变量用于给出当前文件 的路径。


你必须在



的开头定义,


可以这样使用:





LOCAL_PATH := $$(call my-dir)




这个变量不会被

< br>$$(CLEAR_VARS)


清除,


因此每个

< p>


只需要定义一次


(


即使你 在一


个文件中定义了几个模块的情况下


)






(2) LOCAL_MODULE:


这是你模块的名字,它 必须是唯一的,而且不能包含空格。你必须


在包含任一的


$$(B UILD_XXXX)


脚本之前定义它。


模块的名字决定了生成 文件的名字,


例如,



果一个一个共享 库模块的名字是,那么生成文件的名字就是



。但是,在你的


NDK


生成文


件中


(


或者



或者


)


,你应该只涉及


(


引用


)


有正常名字的其他模块。





(3) LOCAL_SRC_FILES:


这是要编译的源代码文件列表。


只要列出要传递给编译器的文件,

< p>
因为编译系统自动为你计算依赖。注意源代码文件名称都是相对于


LOCA L_PATH


的,你可以


使用路径部分,例如:





LOCAL_SRC_FILES := foo.c




toto/bar.c




注意:在生成文件中都要使用


UNI X


风格的斜杠


(/).windows


风格的反斜杠不会被正确的处


理。





(4) LOCAL_CPP_EXTENSION:


这是一个可选变量,用来指定


C++


代码文 件的扩展名,默


认是


'.cpp',


但 是你可以改变它,比如:





LOCAL_CPP_EXTENSION := .cxx




(5) LOCAL_C_INCLUDES :


路径的可选配置,是从根目录开始的,


-


-


-


-


-


-


-


-



本文更新与2021-02-07 13:32,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/608509.html

Android.mk的文件语法规范的相关文章

  • 爱心与尊严的高中作文题库

    1.关于爱心和尊严的作文八百字 我们不必怀疑富翁的捐助,毕竟普施爱心,善莫大焉,它是一 种美;我们也不必指责苛求受捐者的冷漠的拒绝,因为人总是有尊 严的,这也是一种美。

    小学作文
  • 爱心与尊严高中作文题库

    1.关于爱心和尊严的作文八百字 我们不必怀疑富翁的捐助,毕竟普施爱心,善莫大焉,它是一 种美;我们也不必指责苛求受捐者的冷漠的拒绝,因为人总是有尊 严的,这也是一种美。

    小学作文
  • 爱心与尊重的作文题库

    1.作文关爱与尊重议论文 如果说没有爱就没有教育的话,那么离开了尊重同样也谈不上教育。 因为每一位孩子都渴望得到他人的尊重,尤其是教师的尊重。可是在现实生活中,不时会有

    小学作文
  • 爱心责任100字作文题库

    1.有关爱心,坚持,责任的作文题库各三个 一则150字左右 (要事例) “胜不骄,败不馁”这句话我常听外婆说起。 这句名言的意思是说胜利了抄不骄傲,失败了不气馁。我真正体会到它

    小学作文
  • 爱心责任心的作文题库

    1.有关爱心,坚持,责任的作文题库各三个 一则150字左右 (要事例) “胜不骄,败不馁”这句话我常听外婆说起。 这句名言的意思是说胜利了抄不骄傲,失败了不气馁。我真正体会到它

    小学作文
  • 爱心责任作文题库

    1.有关爱心,坚持,责任的作文题库各三个 一则150字左右 (要事例) “胜不骄,败不馁”这句话我常听外婆说起。 这句名言的意思是说胜利了抄不骄傲,失败了不气馁。我真正体会到它

    小学作文