2013-08-21 44 views
8

Tôi đang sử dụng NDK của Android để xây dựng dự án cocos2dx của mình, trong Android.mk, có định nghĩa cho LOCAL_SRC_FILES trong đó mỗi tệp cpp được liệt kê. Bất cứ khi nào tôi đã thêm một file nguồn mới, tôi sẽ cần phải thêm nó ở đó cũng ... nó trông như thế này:Android.mk - xây dựng tất cả tệp nguồn trong một thư mục

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

tập tin tiêu đề, tuy nhiên, có thể chỉ định toàn bộ thư mục để bao gồm, nó trông giống như này:

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

tôi đã thử nhiều cách khác nhau để bao gồm toàn bộ thư mục thay vì tập tin duy nhất cho LOCAL_SRC_FILES vì vậy mà tôi không cần phải sửa đổi Android.mk xây dựng kịch bản bất cứ khi nào tôi thêm một tập tin mới, tuy nhiên, cho đến nay mọi nỗ lực của tôi đều thất bại.

Tôi đã thử này:

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

cũng như này:

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

cả hai đều không làm việc ...

tôi có một dự án mà hoạt động tốt với tùy chọn đầu tiên mặc dù, tôi thực sự không hiểu tại sao nó không hoạt động trong dự án cocos2dx ... không ai biết tại sao hay biết giải pháp? Hoặc có lẽ tôi nên để nó như thế và lấy rắc rối, vì mọi người đang làm điều đó., Nhưng nó thực sự rắc rối, hy vọng ai đó có thể giúp đỡ để tất cả chúng ta có thể làm việc hiệu quả hơn ..

Cảm ơn!

Trả lời

17

Ký tự đại diện này cũng hoạt động cho các dự án cocos2dx. Tôi đang sử dụng nó trên của riêng tôi, chỉ là cú pháp của bạn là không chính xác

Hãy thử:

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

Có phải đệ quy không? Tôi có nghĩa là nếu có thư mục con trong 'Classes'directory, các' .cpp'files bên trong những giám đốc sẽ được đưa vào tài khoản trong 'CLASSES_FILES'? Tôi đoán là không. Nó là một cách để làm cho nó đệ quy? – Narek

+1

Không, nó không đệ quy, bạn phải thêm một dòng khác chỉ định thư mục con –

+0

Điều này không hiệu quả đối với tôi. Lỗi tương tự ... –

0

Đây là một makefile. Makefiles không hoạt động như thế. Bạn không thể chỉ định toàn bộ thư mục cho các tệp để biên dịch - nó không được thiết lập theo cách đó. Nó đã được như vậy trong 40 năm hoặc lâu hơn. Một trong nhiều lý do tại sao mọi người ghét makefiles. Vấn đề là tất cả các thay thế đã được chỉ là xấu.

6

Thực ra ký tự đại diện làm việc và bạn đã đi đúng hướng ...

Đây là một ví dụ về những gì hoạt động tốt đối với tôi:

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

Thông báo sự bao gồm của $ (LOCAL_PATH) biến , và sau đó

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

Điều đó sẽ cho phép bạn thả vào bất kỳ tệp nguồn nào và nó sẽ biên dịch mà không cần quay lại tệp Android.mk.

+1

cảm ơn! Tôi đã thử, nhưng nó vẫn không hoạt động ... biên dịch lỗi với biểu tượng không tìm thấy .. – Zennichimaro

+0

Chỉnh sửa câu trả lời của tôi, so sánh hai dòng đầu tiên. Bạn đang thiếu biến $ (LOCAL_PATH). PS: dấu "#" trong tệp makefile là dành cho nhận xét! – Erik

1

tôi nghĩ bạn không cần phải thêm toàn bộ tiêu đề cho tệp .cpp mới được thêm vào .. bạn chỉ cần thêm nó theo cách này

ví dụ. nếu bạn muốn thêm LaunchScreen.cpp này thì bạn nên bao gồm nó theo cách đơn giản này

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

Để xây dựng tất cả các bạn.file cpp dưới ../../Classes/, bạn có thể sử dụng bên ngoài find lệnh nếu bạn xây dựng dự án của bạn trên một hệ điều hành UNIX-like:

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

Như đã đề cập trong link: Recursive wildcards in GNU make?, một cách khác là sử dụng các ký tự đại diện đệ quy sau. Nó được viết với các quy tắc Makefile thuần túy, do đó nó là xách tay và tốt hơn.

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

Sau giờ chiến đấu với điều này tôi tìm thấy một giải pháp mà cuối cùng làm việc với thiết lập cocos2dx tôi (cocos2dx 3,10)

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

trả lời ở đây vì lợi ích của việc giúp đỡ một ai đó ra với nỗi đau tương tự kể từ khi -năng- hoạt động, câu hỏi này vẫn còn liên quan đến ngày này Đáng chú ý, điều này cũng hoạt động cho Windows là vấn đề chính mà tôi gặp phải với các giải pháp khác

Nguồn: http://qiita.com/YosukeMitsugi/items/137f1b57f03945ad2d50

0

đây là những gì làm việc cho tôi trong cocos2dx 3.10 dưới chiến thắng 10:

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

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