【问题标题】:Android.mk - build all source file in a directoryAndroid.mk - 在一个目录中构建所有源文件
【发布时间】:2013-08-23 07:49:10
【问题描述】:

我正在使用 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 项目中不起作用......有人知道为什么或知道解决方案吗?或者也许我应该保持原样并承担麻烦,因为每个人都在这样做。但这真的很麻烦,希望有人能提供帮助,以便我们所有人都能更有效率..

谢谢!

【问题讨论】:

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


    【解决方案1】:

    通配符也适用于 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)
    

    【讨论】:

    • 它是递归的吗?我的意思是如果Classesdirectory 中有子目录,那么这些目录中的.cppfiles 将在CLASSES_FILES 中考虑?我想不是。这是一种使其递归的方法吗?
    • 不,它不是递归的,您必须添加另一行指定子目录
    【解决方案2】:

    实际上通配符确实有效,而且您走在正确的轨道上......

    这是一个适合我的例子:

    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 文件的情况下进行编译。

    【讨论】:

    • 谢谢!我试过了,还是不行...编译错误,找不到符号..
    • 编辑了我的答案,比较前两行。您缺少 $(LOCAL_PATH) 变量。 PS:makefile 中的“#”用于 cmets!
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      要在 ../../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】:

        这是一个生成文件。 Makefiles 不是那样工作的。您不能为要编译的文件指定整个目录 - 它只是不是这样设置的。 40 多年来一直如此。人们讨厌 makefile 的众多原因之一。问题是所有的替代品都一样糟糕。

        【讨论】:

          【解决方案6】:

          经过数小时的努力,我找到了一个最终适用于我的 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

          【讨论】:

            【解决方案7】:

            这是在 win 10 下的 cocos2dx 3.10 中对我有用的:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-06-21
              • 2014-07-27
              • 2019-07-11
              • 1970-01-01
              • 2013-11-02
              相关资源
              最近更新 更多