Андроид.Mk-построить весь исходный файл в каталоге

я использую 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 build script всякий раз, когда я добавляю новый файл, однако, до сих пор все мои попытки не увенчались успехом.

Я попытался это:

#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 ответов


подстановочный знак работает и для проектов 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)

На самом деле подстановочные знаки работают, и Вы были на правильном пути...

Это пример того, что отлично работает для меня:

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.


Я думаю, вам не нужно добавлять весь заголовок для нового добавления .cpp-файлы .. вы должны просто добавить его таким образом

например . если вы хотите добавить этот LaunchScreen.cpp, то вы должны включить его этот простой способ

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

Это makefile. Makefiles так не работают. Вы не можете указать весь каталог файлов для компиляции, он просто не настроен таким образом. Так было лет 40 или около того. Одна из многих причин, почему люди ненавидят makefiles. Проблема в том, что все замены были такими же плохими.


чтобы построить все ваши .cpp-файлы под ../../Classes/, вы можете использовать внешний find команда если вы создаете свой проект на UNIX-подобной ОС:

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: рекурсивные подстановочные знаки в GNU make?, другой способ-использовать следующий рекурсивный подстановочный знак. Он написан с чистыми правилами Makefile, таким образом, он портативен и лучше.

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

после нескольких часов борьбы с этим я нашел решение, которое, наконец, работает с моей установкой 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


это то, что сработало для меня в cocos2dx 3.10 под win 10:

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

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