2012-01-23 114 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)) 
相關問題