轉自:http://blog.csdn.net/ypfsoul/article/details/8909178
Makefile Android.mk 引發的思索
在我們編寫 Android 平台 cocos2d-x 游戲的時候,我們除了編寫 Classes
之內的源代碼文件之外,我們還需要維護其編譯文件 Android.mk,如我們在 Classes 添加新的源文件,那么我們就要在 Android.mk 配置添加其編譯路徑,如:
LOCAL_SRC_FILES := hellocpp/main.cpp \ ../../Classes/AppDelegate.cpp \ ../../Classes/HelloWorldScene.cpp
每添加一個源文件,我們就要手動添加一個配置,始其能夠被編譯,同樣的,在 proj.linux 的 Makefile 文件也有這樣的情況:
OBJECTS = ./main.o \ ../Classes/AppDelegate.o \ ../Classes/HelloWorldScene.o
當然讓我們手動維護其配置,當然可以,不過麻煩非常,對於像我這樣“懶惰”之人,當然需要想辦法讓其自動管理嘍 ~
自動編譯、自動維護
如果要自動維護編譯文件之內的源代碼文件,我們需要的無非就是所有的源代碼文件及其路徑,而這樣的工作可以通過 Linux 強大的命令 find 來實現自動完成,Android.mk 文件如下:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := game_shared LOCAL_MODULE_FILENAME := libgame # 定義 all-cpp-files 返回當前路徑和 Classes 路徑想的所有 cpp 文件,注意:這里只考慮 cpp 而沒有 c,如果需要自行添加 define all-cpp-files $(patsubst jni/%,%, $(shell find $(LOCAL_PATH)/../../Classes/ $(LOCAL_PATH)/hellocpp -name "*.cpp")) endef # 這里使用新的方式替換換來的方式,以自動添加源文件 LOCAL_SRC_FILES := $(call all-cpp-files) #LOCAL_SRC_FILES := hellocpp/main.cpp \ # ../../Classes/AppDelegate.cpp \ # ../../Classes/HelloWorldScene.cpp LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes LOCAL_WHOLE_STATIC_LIBRARIES := cocos2dx_static cocosdenshion_static cocos_extension_static include $(BUILD_SHARED_LIBRARY) $(call import-module,CocosDenshion/android) \ $(call import-module,cocos2dx) \ $(call import-module,extensions) # 根據自己需要是否啟用,上面的靜態庫同樣
這樣一個 Android.mk 算是萬能的配置了,基本能滿足我們編寫 cocos2d-x 游戲的大多數需求了,當然如果你使用了第三方庫,當然還是需要手動添加一下配置了,不過就源文件來說,不需要手動維護,倒是省事許多。下面在貼一個 Makefile 的萬能配置:
CC = gcc CXX = g++ TARGET = leafsoar # 為了保持通用性,干脆起個不相干的目標文件,此名隨意 CCFLAGS = -Wall CXXFLAGS = -Wall VISIBILITY = # COCOS2DX_ROOT = /home/leafsoar/... # 如果已經配置過此環境變量,可以不需要此,否則添加此變量值 COCOS2DX_PATH = $(COCOS2DX_ROOT)/cocos2dx INCLUDES = -I../ \ -I../Classes \ -I$(COCOS2DX_PATH) \ -I$(COCOS2DX_PATH)/platform/third_party/linux \ -I$(COCOS2DX_PATH)/platform/third_party/linux/libfreetype2 \ -I$(COCOS2DX_PATH)/cocoa \ -I$(COCOS2DX_PATH)/include \ -I$(COCOS2DX_PATH)/platform \ -I$(COCOS2DX_PATH)/platform/linux \ -I$(COCOS2DX_PATH)/platform/third_party/linux/glew-1.7.0/glew-1.7.0/include/ \ -I$(COCOS2DX_PATH)/kazmath/include \ -I$(COCOS2DX_PATH)/platform/third_party/linux/libxml2 \ -I$(COCOS2DX_PATH)/platform/third_party/linux/libjpeg \ -I$(COCOS2DX_ROOT)/CocosDenshion/include \ # -I$(COCOS2DX_ROOT)/extensions/ \ # 根據自己需要是否包含 extensions 擴展 DEFINES = -DLINUX # 獲取源文件列表 define all-cpp-files $(patsubst ./%,%, $(shell find ../Classes ./ -name "*.cpp")) endef # 我是打算讓所以編譯后的 ".o" 臨時文件,全部生成在 "obj" 目錄,而不是和源代碼同目錄 define all-cpp-dir $(patsubst ../%,obj/%, $(shell find ../Classes -type d)) endef # obj 默認目錄 OBJDIR=obj/Classes # 獲取所有的編譯文件列表 OBJECTS=$(patsubst %.cpp,$(OBJDIR)/%.o,$(call all-cpp-files)) # 獲取所有的編譯文件路徑,如果不存在路徑則,編譯可能出現問題 OBJECTS_DIR=$(call all-cpp-dir) # 如果目錄不存在,則創建相應的目錄,-p 命令保證了,如果存在,不需要重新創建,這樣沒有修改的源文件就無需重新編譯,提高速度 $(shell mkdir -p obj) $(shell mkdir -p $(OBJECTS_DIR)) #echo: # @echo $(OBJECTS_DIR) #OBJECTS = ./main.o \ # ../Classes/AppDelegate.o LBITS := $(shell getconf LONG_BIT) ifeq ($(LBITS),64) STATICLIBS_DIR = $(COCOS2DX_ROOT)/cocos2dx/platform/third_party/linux/libraries/lib64 else STATICLIBS_DIR = $(COCOS2DX_ROOT)/cocos2dx/platform/third_party/linux/libraries endif STATICLIBS = STATICLIBS = $(STATICLIBS_DIR)/libfreetype.a \ $(STATICLIBS_DIR)/libxml2.a \ $(STATICLIBS_DIR)/libpng.a \ $(STATICLIBS_DIR)/libjpeg.a \ $(STATICLIBS_DIR)/libtiff.a \ # $(STATICLIBS_DIR)/libGLEW.a \ SHAREDLIBS = ifeq ($(LBITS),64) SHAREDLIBS_DIR = $(COCOS2DX_ROOT)/CocosDenshion/third_party/fmod/lib64/api/lib SHAREDLIBS = -L$(SHAREDLIBS_DIR) -lfmodex64 else SHAREDLIBS_DIR = $(COCOS2DX_ROOT)/CocosDenshion/third_party/fmod/api/lib SHAREDLIBS = -L$(SHAREDLIBS_DIR) -lfmodex endif SHAREDLIBS += -lglfw -lGL SHAREDLIBS += -Wl,-rpath,$(SHAREDLIBS_DIR) SHAREDLIBS += -L$(COCOS2DX_ROOT)/cocos2dx/platform/third_party/linux/glew-1.7.0/glew-1.7.0/lib -lGLEW SHAREDLIBS += -Wl,-rpath,$(COCOS2DX_ROOT)/cocos2dx/platform/third_party/linux/glew-1.7.0/glew-1.7.0/lib BIN_DIR_ROOT=bin BIN_DIR = $(BIN_DIR_ROOT) debug: BIN_DIR = $(BIN_DIR_ROOT)/debug debug: CCFLAGS += -g3 -O0 debug: CXXFLAGS += -g3 -O0 debug: SHAREDLIBS += -L$(COCOS2DX_ROOT)/lib/linux/Debug -lcocos2d -lrt -lz -lcocosdenshion debug: SHAREDLIBS += -Wl,-rpath,$(COCOS2DX_ROOT)/lib/linux/Debug/ debug: DEFINES += -DDEBUG debug: $(TARGET) release: BIN_DIR = $(BIN_DIR_ROOT)/release release: CCFLAGS += -O3 release: CXXFLAGS += -O3 release: SHAREDLIBS += -L.$(COCOS2DX_ROOT)/lib/linux/Release -lcocos2d -lrt -lz -lcocosdenshion release: SHAREDLIBS += -Wl,-rpath,$(COCOS2DX_ROOT)/lib/linux/Release/ release: DEFINES += -DNDEBUG release: $(TARGET) ####### Build rules $(TARGET): $(OBJECTS) mkdir -p $(BIN_DIR) $(CXX) $(CXXFLAGS) $(INCLUDES) $(DEFINES) $(OBJECTS) -o $(BIN_DIR)/$(TARGET) $(SHAREDLIBS) $(STATICLIBS) ####### Compile $(OBJDIR)/%.o: %.cpp $(CXX) $(CXXFLAGS) $(INCLUDES) $(DEFINES) $(VISIBILITY) -c $< -o $@ %.o: %.c $(CC) $(CCFLAGS) $(INCLUDES) $(DEFINES) $(VISIBILITY) -c $< -o $@ clean: rm -f $(OBJECTS) $(TARGET) core
有了此 Makefile 我們就能滿足我們絕大多數需求了,並且還做了目錄優化,將所有源文件生成的 .o
文件統一放在了 obj 目錄之下,方便管理,否則源文件路徑會稍顯零亂。實現方式,就是通過命令先創建符合條件的路徑,然后修改其編譯生成的臨時文件路徑。這只是我在使用 cocos2d-x 2.0.4 才出現的問題,而在最新版本2.1.12好似做了些修改,不需要顯示的修改其.o
文件路徑。