2013-08-21 18 views
8

Używam Android NDK do zbudowania mojego projektu cocos2dx, w ramach systemu Android.mk istnieje definicja LOCAL_SRC_FILES, w której wymieniono każdy z plików cpp. Ilekroć dodany nowy plik źródłowy, to muszę go dodać również tam ... to wygląda tak:Android.mk - kompilacja całego pliku źródłowego w katalogu

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

plik nagłówka, można jednak określić cały katalog na to, wygląda na to, to:

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

próbowałem różnych sposobów, aby obejmować cały katalog zamiast pojedynczego pliku do LOCAL_SRC_FILES tak, że nie trzeba zmodyfikować Android.mk zbudować skrypt ilekroć dodać nowy plik, jednak do tej pory wszystkie moje próby zawiodły.

Próbowałem to:

#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/%=%) 

jak ten:

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

oboje nie pracują ...

mam inny projekt, który dobrze współpracuje z pierwszej opcji jednak, naprawdę nie rozumiem, dlaczego to nie działa w projekcie cocos2dx ... czy ktoś wie dlaczego lub zna rozwiązanie? A może powinienem zostawić go tak, jak jest i podjąć trud, ponieważ wszyscy to robią., Ale to naprawdę kłopotliwe, mam nadzieję, że ktoś może pomóc, abyśmy wszyscy byli bardziej produktywni ..

Dzięki!

Odpowiedz

17

symbolu wieloznacznego pracuje dla projektów cocos2dx również. Używam go na własną rękę, tak że składnia jest niepoprawna

Spróbuj:

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

Czy jest to rekurencyjne? Mam na myśli to, że jeśli istnieją podkatalogi w katalogu "Klasy", pliki '.cpp' w tych systemach będą brane pod uwagę w' KLASACH_FILES'? Chyba tak nie jest. Czy jest to sposób na rekurencję? – Narek

+1

Nie, to nie jest rekurencyjne, musisz dodać kolejną linię, która określa podkatalog –

+0

To nie działa dla mnie. Ten sam błąd ... –

0

To jest plik Makefile. Pliki Makefile nie działają w ten sposób. Nie można określić całego katalogu dla plików do kompilacji - po prostu nie jest skonfigurowany w ten sposób. Tak było przez 40 lat. Jednym z wielu powodów, dla których ludzie nie cierpią plików Makefile. Problem polega na tym, że wszystkie wymiany były równie złe.

6

Właściwie symbole wieloznaczne zrobić pracę i jesteś na dobrej drodze ...

To jest przykład tego, co działa dobrze dla mnie:

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

Wskazówka włączenie zmiennej $ (LOCAL_PATH) , a następnie To powinno pozwolić ci na opuszczenie dowolnego pliku źródłowego i skompiluje się bez powrotu do pliku Android.mk.

+1

dzięki! Próbowałem, ale nadal nie działa ... Błąd kompilacji z nieznalezionym symbolem. – Zennichimaro

+0

Zmieniono moją odpowiedź, porównaj pierwsze dwa wiersze. Brakuje zmiennej $ (LOCAL_PATH). PS: "#" w pliku Makefile służy do komentowania! – Erik

1

myślę, że nie trzeba dodawać cały nagłówek nowych dodawanych plików .cpp .. należy po prostu dodaje się to w ten sposób

na przykład. jeśli chcesz dodać tę LaunchScreen.cpp następnie należy umieścić go w ten prosty sposób

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

Aby zbudować cały wasz.Pliki CPP pod ../../Classes/, można użyć polecenia zewnętrznego find jeśli budować swój projekt na UNIXopodobnych:

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

Jak sugerowano w link: Recursive wildcards in GNU make?, innym sposobem jest użycie następującego rekurencyjną wieloznaczny. Jest napisany z czystymi regułami Makefile, dzięki czemu jest przenośny i lepszy.

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)/%=%) 
0

Po godzinach walki z tym znalazłem rozwiązanie, które wreszcie współpracuje z mojej konfiguracji cocos2dx (cocos2dx 3.10)

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

Odpowiadając tutaj w trosce o pomoc kogoś z tym samym bólem Ponieważ -actually- działa, kwestia ta nadal jest istotne, aby ten dzień Warto zauważyć, że ta działa także dla Windows, który był głównym problemem doświadczyłem z innymi rozwiązaniami

Źródło: http://qiita.com/YosukeMitsugi/items/137f1b57f03945ad2d50

0

to co pracował dla mnie w cocos2dx 3,10 pod wygranej 10:

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

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