【问题标题】:Android.mk, include all cpp filesAndroid.mk,包含所有 cpp 文件
【发布时间】:2012-02-17 07:30:56
【问题描述】:

我正在尝试使用 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),但它现在确实有效,似乎没有选择任何文件。

【问题讨论】:

    标签: android android-ndk


    【解决方案1】:

    使用这个:

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

    【讨论】:

      【解决方案2】:

      我一直在为我的 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 是要点

      【讨论】:

      • 对于任何使用它的人,请确保将此定义放在您的 Makefile 之前任何使用它的代码中,否则对其的调用将静默失败。
      • 只是一个注释,这是完美的解决方案
      • 如何从 FILE_LIST 中排除路径?当我将 FILE_LIST 分配给 LOCAL_SRC_FILES 时,为什么要写 $(FILE_LIST:$(LOCAL_PATH)/%=%),而不仅仅是 $(FILE_LIST)?
      【解决方案3】:

      这样怎么样:

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

      如果您担心 * 的扩展包含 $(LOCAL_PATH)/,那可能没问题:

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

      【讨论】:

        【解决方案4】:

        你可以试试这样的……

        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

        【讨论】:

        • @DiscGolfer 为什么要从列表中删除LOCAL_PATH
        • @Narek 您必须在Android.mk 的顶部定义LOCAL_PATH := $(call my-dir)。这包含从 NDK 根目录到当前文件的相对路径。因此,在上面的LOCAL_SRC_FILES 行中,我从列表中删除了LOCAL_PATH,因为文件路径是相对于LOCAL_PATH 的。如果不删除,这将使路径无效。
        • “通配符”部分是什么意思? LOCAL_PATH 将扩展为路径是有道理的,“通配符”是预定义的值吗?是否应该用“通配符”代替?
        • $(FILE_LIST:$(LOCAL_PATH)/%=%) 是什么意思?
        • @Delargo 这会从FILE_LIST 中的每个文件路径中删除LOCAL_PATH。它基本上使LOCAL_SRC_FILES 列表只包含文件的相对路径。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-18
        • 2014-01-04
        • 1970-01-01
        • 2012-11-18
        相关资源
        最近更新 更多