Android.mk,包含所有cpp文件。

51

我正在尝试使用ndk构建Android项目,但遇到了一些问题。

这是可以正常工作的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 = $(wildcard *.cpp),但是它并没有起作用,似乎没有选择任何文件。

4个回答

76

你可以尝试这样做...

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


1
@DiscGolfer 为什么你从列表中删除了 LOCAL_PATH - Narek
1
@Narek 在你的 Android.mk 文件顶部必须定义 LOCAL_PATH := $(call my-dir)。这将保存从你的 NDK 根目录到当前文件的相对路径。因此,在上面的 LOCAL_SRC_FILES 行中,我从列表中删除了 LOCAL_PATH,因为文件路径是相对于 LOCAL_PATH 的。如果不删除,路径将无效。 - DRiFTy
“通配符”部分是什么意思?LOCAL_PATH会被扩展为路径,那么“wildcard”是预定义的值吗?“通配符”应该被替换为某些内容吗? - Alyoshak
@Alyoshak 通配符关键字是标准的Makefile函数,它根据我们给定的模式匹配并创建文件名列表。您需要修改的唯一部分是正在使用的模式(也就是指向您的.cpp文件的路径)。 - DRiFTy
2
$(FILE_LIST:$(LOCAL_PATH)/%=%) 是什么意思? - Sergei Vasilenko
1
@Delargo 这将从FILE_LIST中的每个文件路径中删除LOCAL_PATH。这基本上使得LOCAL_SRC_FILES列表仅包含相对于您的文件的路径。 - DRiFTy

22

我一直在使用这个脚本作为我的 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)/%=%)

这里是要点概述


对于任何使用此代码的人,请确保将此定义放置在您的Makefile中,放在任何使用它的代码之前,否则对它的调用将会悄无声息地失败。 - Christopher Orr
只是一条注释,这是完美的解决方案。 - Hassen Dhia
如何从FILE_LIST中排除路径?为什么在将FILE_LIST分配给LOCAL_SRC_FILES时,要写成$(FILE_LIST:$(LOCAL_PATH)/%=%),而不是只写$(FILE_LIST)? - Sergei Vasilenko

3
像这样怎么样:
LOCAL_SRC_FILES := $(subst $(LOCAL_PATH)/,,$(wildcard $(LOCAL_PATH)/*.cpp))

如果您担心 * 的扩展包含 $(LOCAL_PATH)/,那么也许可以接受:
LOCAL_SRC_FILES := $(subst $(LOCAL_PATH)/./,,$(wildcard $(LOCAL_PATH)/./*.cpp))

0

使用这个:

LOCAL_SRC_FILES += $($(wildcard $(LOCAL_PATH)/*.cpp):$(LOCAL_PATH)/%=%)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接