2012-01-23 78 views
46

我想用ndk构建一个Android项目,但我遇到了一些麻烦。Android.mk,包括所有的cpp文件

下面是工作的Android.mk文件:

LOCAL_PATH:= $(call my-dir) 

include $(CLEAR_VARS) 

LOCAL_MODULE := mylib 
LOCAL_CFLAGS := -Werror 
LOCAL_SRC_FILES := main.cpp, Screen.cpp, ScreenManager.cpp 
LOCAL_LDLIBS := -llog 

include $(BUILD_SHARED_LIBRARY) 

有没有办法,让我所有指定目录中的* .cpp文件,没有LOCAL_SRC_FILES下手工列出他们呢?

到目前为止,我尝试使用LOCAL_SRC_FILES = $(通配符* .cpp),但它现在工作,似乎没有文件被选中。

回答

71

你可以尝试这样的事情......

FILE_LIST := $(wildcard $(LOCAL_PATH)/[DIRECTORY]/*.cpp) 
LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%) 

...更改[DIRECTORY]到文件的实际目录。如果它们与您的.mk文件位于同一目录中,请删除该部分。创建FILE_LIST变量以查找[DIRECTORY]目录下的所有.cpp文件。然后在文件列表中使用它。然后LOCAL_SRC_FILES行将从列表中删除LOCAL_PATH

+0

谢谢,它的工作! – gq3

+1

@DiscGolfer为什么要从列表中删除'LOCAL_PATH'? – Narek

+1

@Narek你必须在你的'Android.mk'的顶部定义'LOCAL_PATH:= $(call my-dir)'。这保存了从NDK根到当前文件的相对路径。因此,在上面的LOCAL_SRC_FILES行中,我从列表中删除了'LOCAL_PATH',因为文件路径与'LOCAL_PATH'相关。如果不删除,会导致路径无效。 – DRiFTy

20

我一直在使用这个脚本为我的Android.mk救了我这么多时间!

#traverse all the directory and subdirectory 
define walk 
    $(wildcard $(1)) $(foreach e, $(wildcard $(1)/*), $(call walk, $(e))) 
endef 

#find all the file recursively under jni/ 
ALLFILES = $(call walk, $(LOCAL_PATH)) 
FILE_LIST := $(filter %.cpp, $(ALLFILES)) 

LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%) 

Here是要点

+0

对于任何使用它的人来说,确保这个定义放置在您的Makefile _before_任何使用它的代码中,否则调用它将会失败。 –

+0

只是一个说明,这是完美的解决方案 –

+0

如何从FILE_LIST中排除路径?当我将FILE_LIST分配给LOCAL_SRC_FILES时,为什么写$(FILE_LIST:$(LOCAL_PATH)/%=%),而不是$(FILE_LIST)? –

2

这个怎么样:

LOCAL_SRC_FILES := $(subst $(LOCAL_PATH)/,,$(wildcard $(LOCAL_PATH)/*.cpp)) 

如果你怕的*扩展包含$(LOCAL_PATH)/,它可能是OK:

LOCAL_SRC_FILES := $(subst $(LOCAL_PATH)/./,,$(wildcard $(LOCAL_PATH)/./*.cpp)) 
相关问题