Android.mk 之 静态库和动态库

如何将工程下的所有源码文件添加到变量中?

关于这个问题可以有两种解决思路:

1.可以手动将每个文件添加到Android.mk中。

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := test
LOCAL_SRC_FILES := test.c \      #手动添加源码文件
                   test1.c
LOCAL_MODULE_PATH := $(LOCAL_PATH)
include $(BUILD_EXECUTABLE)

这样做就是在LOCAL_SRC_FILES中不停添加更多的文件,而这样一来,每一次新添加文件,都需要更改mk文件,特别麻烦还容易出错。

2. 使用系统提供的函数处理。

我们应该用哪一个函数呢?先去 build/make/core/definition.mk 文件下找到这样一个函数:

###########################################################
## Find all of the c files from here.  Meant to be used like:
##    SRC_FILES := $(call all-subdir-c-files)
###########################################################
 
define all-subdir-c-files
$(call all-c-files-under,.)
endef
###########################################################
## Find all of the c files under the named directories.
## Meant to be used like:
##    SRC_FILES := $(call all-c-files-under,src tests)
###########################################################
 
define all-c-files-under
$(call all-named-files-under,*.c,$(1))
endef

###########################################################
## Find all of the files under the named directories with
## the specified name.
## Meant to be used like:
##    SRC_FILES := $(call all-named-files-under,*.h,src tests)
###########################################################
 
define all-named-files-under
$(call find-files-in-subdirs,$(LOCAL_PATH),"$(1)",$(2))
endef

###########################################################
# Use utility find to find given files in the given subdirs.
# This function uses $(1), instead of LOCAL_PATH as the base.
# $(1): the base dir, relative to the root of the source tree.
# $(2): the file name pattern to be passed to find as "-name".
# $(3): a list of subdirs of the base dir.
# Returns: a list of paths relative to the base dir.
###########################################################
 
define find-files-in-subdirs
$(sort $(patsubst ./%,%, \
  $(shell cd $(1) ; \
          find -L $(3) -name $(2) -and -not -name ".*") \
 ))
endef

虽然在Android的版本迭代中,这个方法的变化实在太大了,我们顺着这个方法往里找还是可以找到的,所表达的还是编译这个目录下的所有 *.c 文件。

我们知道了要使用这个方法后,就需要调用这个方法,以减轻手写的工作量了。

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := test
LOCAL_C_ALL_FILES := $(call all-subdir-c-files)
LOCAL_SRC_FILES := $LOCAL_C_ALL_FILES
LOCAL_MODULE_PATH := $(LOCAL_PATH)
include $(BUILD_EXECUTABLE)

如果将代码改掉,又在同样的目录下添加几个.c文件,也会直接把新添加上的文件直接编译进去,不需要修改Android.mk,这样就比单纯的添加一个个文件方便的多了。

如何在一个Android.mk中生成两个目标文件?

为了方便,假如说要编译两份只是名字不同,其他都一样的目标文件。从include $(CLEAR_VARS)开始,将编译源码复制两份,将LOCAL_MODULE分别设为test和test1。

LOCAL_PATH := $(call my-dir)
 
include $(CLEAR_VARS)
LOCAL_MODULE := test
LOCAL_C_ALL_FILES := $(call all-subdir-c-files)
LOCAL_SRC_FILES := $LOCAL_C_ALL_FILES
LOCAL_MODULE_PATH := $(LOCAL_PATH)
include $(BUILD_EXECUTABLE)
 
include $(CLEAR_VARS)
LOCAL_MODULE := test1
LOCAL_C_ALL_FILES := $(call all-subdir-c-files)
LOCAL_SRC_FILES := $LOCAL_C_ALL_FILES
LOCAL_MODULE_PATH := $(LOCAL_PATH)
include $(BUILD_EXECUTABLE)

这样一来,他会先生成一份test,然后又接着生成了一份test1

如何编译生成一个动态库?

编译动态库,其实前面的东西都可以不用动,只需要将编译类型更改为 BUILD_SHARED_LIBRARY 。

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libtest
LOCAL_SRC_FILES := test.c \
                   test1.c
LOCAL_MODULE_PATH := $(LOCAL_PATH)
include $(BUILD_SHARED_LIBRARY)

这样,就编译生成了 libtest.so,编译它的源码分别就是 test.c 和 test1.c 。

如何编译生成一个静态库?

与编译一个动态库是一样的,只不过就是把编译类型修改为 BUILD_STATIC_LIBRARY 。

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libtest
LOCAL_SRC_FILES := test.c \
                   test1.c
LOCAL_MODULE_PATH := $(LOCAL_PATH)
include $(BUILD_STATIC_LIBRARY)

会编译生成静态库 libtest.a。

静态库与动态库有什么区别呢?

在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值