如何将工程下的所有源码文件添加到变量中?
关于这个问题可以有两种解决思路:
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。
静态库与动态库有什么区别呢?
在linux中,静态库是以 .a 的形式存在;动态库是以 .so 的形式存在。