Android.mk - 在目录中构建所有源文件

时间:2013-08-21 04:40:07

标签: android cocos2d-iphone android-ndk cocos2d-x

我正在使用Android NDK来构建我的cocos2dx项目,在Android.mk中,有一个LOCAL_SRC_FILES的定义,其中列出了每个cpp文件。每当我添加一个新的源文件时,我都需要在那里添加它...它看起来像这样:

LOCAL_SRC_FILES := hellocpp/main.cpp \
                   hellocpp/myclass.cpp \
                   hellocpp/mynextclass.cpp \
                   ../../Classes/Screens/LaunchScreen.cpp \
但是,头文件可以指定要包含的整个目录,如下所示:

LOCAL_C_INCLUDES := $(LOCAL_PATH)/hellocpp
LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../Classes/Screens

我已经尝试了各种方法来包含整个目录而不是LOCAL_SRC_FILES的单个文件,因此每当我添加新文件时我都不需要修改Android.mk构建脚本,但到目前为止我所有的尝试都失败了。

我试过这个:

#SRC_PATH_HELLOCPP := $(wildcard hellocpp/*.cpp)
#SRC_PATH_CLASSES += $(wildcard ../../Classes/*.cpp)

#LOCAL_SRC_FILES := $(SRC_PATH_HELLOCPP:$(LOCAL_PATH/%=%)
#LOCAL_SRC_FILES += $(SRC_PATH_CLASSES:$(LOCAL_PATH/%=%)

以及:

#LOCAL_SRC_FILES += hellocpp/*.cpp
#LOCAL_SRC_FILES += ../../Classes/*.cpp

两者都不起作用......

我有另一个项目与第一个选项配合得很好,我真的不明白为什么它在cocos2dx项目中不起作用...有谁知道为什么或知道解决方案?或者也许我应该保持原样并且麻烦,因为每个人都这样做。但是这真的很麻烦,希望有人可以提供帮助,以便我们所有人都能提高工作效率。

谢谢!

7 个答案:

答案 0 :(得分:17)

通配符也适用于cocos2dx项目。我自己使用它,只是你的语法不正确

尝试:

HELLOCPP_FILES  := $(wildcard $(LOCAL_PATH)/hellocpp/*.cpp)
HELLOCPP_FILES  := $(HELLOCPP_FILES:$(LOCAL_PATH)/%=%)

CLASSES_FILES   := $(wildcard $(LOCAL_PATH)/../../Classes/*.cpp)
CLASSES_FILES   := $(CLASSES_FILES:$(LOCAL_PATH)/%=%)

LOCAL_SRC_FILES := $(HELLOCPP_FILES)
LOCAL_SRC_FILES += $(CLASSES_FILES)

答案 1 :(得分:6)

实际上,通配符可以正常运行,而且你走在正确的轨道上......

这是一个对我有用的例子:

UTILITIES := $(wildcard $(LOCAL_PATH)/Utility/*.cpp)
ZIP := $(wildcard $(LOCAL_PATH)/Utility/zip/jni/*.c)

注意包含$(LOCAL_PATH)变量,然后是

SOURCES := $(UTILITIES:$(LOCAL_PATH)/%=%)
SOURCES += $(ZIP:$(LOCAL_PATH)/%=%)

这应该允许你放入任何源文件,它将编译而不返回到Android.mk文件。

答案 2 :(得分:1)

我认为您不需要为新添加的.cpp文件添加整个标头..您应该以这种方式添加它

例如,

。如果你想添加这个LaunchScreen.cpp,那么你应该以这种简单的方式包含它

LOCAL_SRC_FILES:=hellocpp/main.cpp \
          ../../Classes/myclass.cpp\
          ../../Classes/mynextclass.cpp\ 
          ../../Classes/LaunchScreen.cpp\

答案 3 :(得分:0)

这是一个makefile。 Makefile不会像那样工作。您无法为要编译的文件指定整个目录 - 它不是以这种方式设置的。 40年左右的时间就是这样。人们讨厌makefile的众多原因之一。问题是所有替换都一样糟糕。

答案 4 :(得分:0)

要在../../Classes/下构建所有.cpp文件,如果在类UNIX操作系统上构建项目,则可以使用外部find命令:

SRC_PATH_CLASSES := $(shell find ../../Classes/ -type f)
SRC_PATH_CLASSES := $(filter %.cpp, $(SRC_PATH_CLASSES))
LOCAL_SRC_FILES += $(SRC_PATH_CLASSES:$(LOCAL_PATH)/%=%)

正如link: Recursive wildcards in GNU make?中所建议的,另一种方法是使用以下递归通配符。它是用纯Makefile规则编写的,因此它是可移植的并且更好。

rwildcard=$(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2) $(filter $(subst *,%,$2),$d))
SRC_PATH_CLASSES := $(call rwildcard, ../../Classes/, *.cpp)
LOCAL_SRC_FILES += $(SRC_PATH_CLASSES:$(LOCAL_PATH)/%=%)

答案 5 :(得分:0)

经过几个小时的战斗,我找到了一个最终适用于我的cocos2dx设置的解决方案(cocos2dx 3.10)

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

为了帮助某人自从实际工作以来同样的痛苦而回答这个问题,这个问题仍然与今天有关 值得注意的是,这也适用于Windows,这是我遇到的其他解决方案的主要问题

来源:http://qiita.com/YosukeMitsugi/items/137f1b57f03945ad2d50

答案 6 :(得分:0)

这对我来说在cocos2dx 3.10下的胜利10:

FILE_LIST := $(wildcard $(LOCAL_PATH)/../../../Classes/*.cpp)

LOCAL_SRC_FILES := hellocpp/main.cpp \
LOCAL_SRC_FILES += $(FILE_LIST:$(LOCAL_PATH)/%=%)