`
nfer.zhuang
  • 浏览: 61658 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

深入浅出Android makefile(4)--LOCAL_STATIC_LIBRARIES

 
阅读更多

 

上文我们讲完LOCAL_SRC_FILES,下面我们就一步步来梳理下LOCAL_STATIC_LIBRARIES。

一、 初识LOCAL_STATIC_LIBRARIES
我们首先看看该变量在NDK文档中的定义:
LOCAL_STATIC_LIBRARIES
     应该链接到这个模块的静态库列表(使用 BUILD_STATIC_LIBRARY 生成),这仅仅对共享库模块才有意义。
    The list of static libraries modules (built with BUILD_STATIC_LIBRARY) that should be linked to this module. This only makes sense in shared library modules.
最后一句“这仅仅对共享库模块才有意义”我们先不管,从上述定义中我们知道,LOCAL_STATIC_LIBRARIES肯定是描述了编译当前模块需要的静态库。

在acp模块的编译文件Android.mk中有LOCAL_STATIC_LIBRARIES的定义:LOCAL_STATIC_LIBRARIES := libhost,也就是描述了要编译本模块,必须已经先编译了libhost.a静态库。
但是如果我没有编译出libhost.a静态库,为什么会报*** No rule to make target `out/host/linux-x86/obj/STATIC_LIBRARIES/libhost_intermediates/libhost.a', needed by `out/host/linux-x86/obj/EXECUTABLES/acp_intermediates/acp'.  Stop .这个错误?它又是如何知道,或者说它就是去out/host/linux-x86/obj/STATIC_LIBRARIES/libhost_intermediates/目录下查找libhost.a呢?

二、 built_static_libraries
我们先从找一下在何处使用到了LOCAL_STATIC_LIBRARIES这个变量入手,通过查找,我们发现build/core/binary.mk文件中定义built_static_libraries变量时使用到LOCAL_STATIC_LIBRARIES。
built_static_libraries的定义如下:
built_static_libraries := \
    $(foreach lib,$(LOCAL_STATIC_LIBRARIES), \
      $(call intermediates-dir-for, \
        STATIC_LIBRARIES,$(lib),$(LOCAL_IS_HOST_MODULE))/$(lib)$(a_suffix)) 
我们猜测,编译系统是通过这个变量将LOCAL_STATIC_LIBRARIES中定义的libhost转换为完整的host静态库的地址,下面看我们猜测的对不对。

built_static_libraries 主要调用了foreach函数,取出LOCAL_STATIC_LIBRARIES列表中的每项,然后执行后面的函数并返回最后的结果:
 $(foreach lib,$(LOCAL_STATIC_LIBRARIES), funcX)
具体执行的函数则是 $(call intermediates-dir-for, STATIC_LIBRARIES,$(lib),$(LOCAL_IS_HOST_MODULE))/$(lib)$(a_suffix)
注意,此处是先执行$(call intermediates-dir-for, STATIC_LIBRARIES,$(lib),$(LOCAL_IS_HOST_MODULE)) 函数,然后再添加上/$(lib)$(a_suffix) 后缀

其实 intermediates-dir-for这个函数我们之前已经详细分析过,它就是根据$(1) target class, $(2) target name, $(3) HOST or TARGET以及$(4) COMMON or not这4个参数,返回这个组装的路径,在本例中,返回的是out/host/linux-x86/obj/STATIC_LIBRARIES/libhost_intermediates。其中out/*/linux-x86/obj/*/*_intermediates这个是根据初始参数形成的框架,
host部分 ,根据$(LOCAL_IS_HOST_MODULE)来确定,此处为什么是$(LOCAL_IS_HOST_MODULE)返回true,原因还是include $(BUILD_HOST_EXECUTABLE)中明确说明,这个模块编译的是HOST,当然$(LOCAL_IS_HOST_MODULE)为true,需要的静态库肯定也是在out/host目录下面。
STATIC_LIBRARIES部分 ,intermediates-dir-for函数第一个参数应明确指出这是个静态库。
libhost部分 ,在本例中$(LOCAL_STATIC_LIBRARIES)只描述一个静态库LOCAL_STATIC_LIBRARIES := libhost

因此,整个built_static_libraries 变量的通过展开会返回out/host/linux-x86/obj/STATIC_LIBRARIES/libhost_intermediates/libhost.a 字符串,即编译本模块时所需要的静态库全路径。
如果使用mmm build/tools/acp/直接编译acp,out/host/linux-x86/obj/STATIC_LIBRARIES/libhost_intermediates/目录下查找libhost.a文件失败,所以会报如下错误:
*** No rule to make target `out/host/linux-x86/obj/STATIC_LIBRARIES/libhost_intermediates/libhost.a', needed by `out/host/linux-x86/obj/EXECUTABLES/acp_intermediates/acp'.  Stop.

 

分享到:
评论

相关推荐

    Android Makefile_讲解.doc

    ### Android Makefile详解 在Android开发环境中,Makefile扮演着重要的角色,特别是在构建自定义模块时。本篇文章将深入解析Android.mk文件中的关键概念及用法。 #### 1. 定义路径变量 - **LOCAL_PATH**: 此变量...

    android编译系统makefile(Android.mk)写法.pdf

    include $(CLEAR_VARS) CLEAR_VARS 由编译系统提供,指定让 GNU MAKEFILE 为你清除除 LOCAL_PATH 以外的所有 LOCAL_XXX 变量,如 LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_SHARED_LIBRARIES,LOCAL_STATIC_LIBRARIES ...

    android编译系统makefile(Android.mk)写法扫描.pdf

    各个模块可以通过`LOCAL_SHARED_LIBRARIES`和`LOCAL_STATIC_LIBRARIES`声明对其他模块的依赖,这样编译系统会确保这些依赖项在目标模块之前正确编译。 总结,`Android.mk`文件是Android构建系统的核心,它详细定义...

    Android.mk文档规范

    2. **模块**:Android.mk 允许将源代码组织成不同类型的模块,如静态库(Static Libraries)、共享库(Shared Libraries)等。 3. **变量**:在 Android.mk 文件中,通过定义特定的变量来指定编译选项和源文件路径等...

    android编译系统makefile(Android.mk)写法

    本文将深入探讨`Android.mk`文件的写法和关键知识点。 1. **LOCAL_PATH变量的设定** `LOCAL_PATH`变量的设定是`Android.mk`文件的起点,它指示了源文件所在的目录。通常,`LOCAL_PATH`会被设置为当前`Android.mk`...

    Android.mk 详解剖析

    - **LOCAL_STATIC_LIBRARIES**和`LOCAL_SHARED_LIBRARIES`:分别指定依赖的静态库和共享库。 - **LOCAL_JAVA_LIBRARIES**:如果模块是Java库,这个变量会列出依赖的Java库。 - **LOCAL_RESOURCE_DIR**:用于指定...

    android编译系统makefile(Android.mk)写法.docx

    本文档主要介绍Android.mk文件的基本结构与常用配置方法,帮助开发者更好地理解并编写适用于Android项目的Makefile。 #### 二、基本概念 **1. LOCAL_PATH 变量** - **定义**: `LOCAL_PATH`变量用于指定源文件...

    平台应用demo的Android.mk写法

    `demoApp_native`模块链接了`android_log`库,用于在本地代码中使用`__android_log_print()`函数进行日志输出。 ### 结合`Application.mk`文件 有时,你还需要一个`Application.mk`文件来配置全局的构建选项,如ABI...

    Android_makefile编译系统_Android.mk_文件语法规范

    - `Android.mk`文件支持将源代码组织成不同的模块,如静态库(static libraries)和共享库(shared libraries)。 - 共享库是唯一会被安装到应用程序包中的类型,尽管静态库可以被用于生成共享库。 - 在一个`...

    生成android.mk文件

    - **LOCAL_STATIC_LIBRARIES / LOCAL_SHARED_LIBRARIES**: 依赖的静态或共享库。 - **LOCAL_CFLAGS / LOCAL_LDFLAGS**: 设置编译和链接时的标志。 - **$(call import-add-path, ...)**: 添加额外的搜索路径,用于...

    Android_移植之_iperf

    LOCAL_SHARED_LIBRARIES := libclibm libcutils libnetutils LOCAL_MODULE := iperf # LOCAL_FORCE_STATIC_EXECUTABLE := true # LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES) # LOCAL_UNSTRIPPED_...

    Android_C编译

    - **`LOCAL_STATIC_LIBRARIES`**: 指定需要链接的静态库。 - **`LOCAL_WHOLE_STATIC_LIBRARIES`**: 指定静态库的完整链接,而非默认的部分链接。 - **`LOCAL_CFLAGS`**: 自定义编译器标志。 - **`LOCAL_CPPFLAGS`**:...

    Android_makefile.

    在Android开发中,`makefile`扮演着至关重要的角色,它是构建系统的核心,负责管理项目的编译、链接和打包过程。Android的`makefile`基于GNU Make,遵循特定的语法规则来描述源代码文件之间的依赖关系,以及如何将...

    android下编译C以及动态库调用.pdf

    - `LOCAL_STATIC_LIBRARIES` 和 `LOCAL_SHARED_LIBRARIES` 分别添加静态库和动态库的名称,以链接这些库。 - `LOCAL_MODULE` 定义模块的最终名称。 - `BUILD_EXECUTABLE` 告诉构建系统以可执行程序的形式编译。 ...

    android编译系统makefile(Android.mk)写法参照.pdf

    - `LOCAL_SHARED_LIBRARIES` 和 `LOCAL_STATIC_LIBRARIES`: 分别指定依赖的共享库和静态库。 - `LOCAL_CFLAGS`: 添加编译时的C/C++标志。 - `LOCAL_LDLIBS`: 添加链接时的库(仅适用于可执行文件)。 - `LOCAL_...

    libjson的ubuntu下编译so

    4. **安装**:最后,使用`sudo make install`将编译好的库安装到系统的默认位置(通常是`/usr/local/lib`),并将头文件安装到`/usr/local/include`。 ```bash sudo make install ``` 注意,如果你的项目需要...

    把外部ndk-android工程放入系统源码内一起编译

    int register_android_bluetooth_BluetoothAudioGateway(JNIEnv *env) { return AndroidRuntime::registerNativeMethods(env, "android/bluetooth/BluetoothAudioGateway", sMethods, NELEM(sMethods)); } ``...

    Android增加包的方法

    - `LOCAL_C_INCLUDES`、`LOCAL_STATIC_LIBRARIES`和`LOCAL_SHARED_LIBRARIES`分别用于指定头文件路径、静态库和动态库依赖。 - `include $(BUILD_EXECUTABLE)` 表示我们要构建一个目标机的可执行程序。 编译完成后...

Global site tag (gtag.js) - Google Analytics