cocos2d-x 交叉編譯,維護mk檔案的“萬能”配置解決(轉載)
之前研究cocos2d-x的環境,大部分網上教程都沒提mk檔案的配置怎麼適應大專案的情況,都是以幾個檔案的專案在做demo演示,最近專案越來越大,在用手動配置mk檔案的話,是件很不科學的事,於是找到了這篇文章,留下學習的足跡,同時與大家分享。
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 [email protected] %.o: %.c $(CC) $(CCFLAGS) $(INCLUDES) $(DEFINES) $(VISIBILITY) -c $< -o [email protected] clean: rm -f $(OBJECTS) $(TARGET) core
有了此 Makefile 我們就能滿足我們絕大多數需求了,並且還做了目錄優化,將所有原始檔生成的 .o
檔案統一放在了 obj 目錄之下,方便管理,否則原始檔路徑會稍顯零亂。實現方式,就是通過命令先建立符合條件的路徑,然後修改其編譯生成的臨時檔案路徑。這只是我在使用 cocos2d-x 2.0.4 才出現的問題,而在最新版本2.1.12好似做了些修改,不需要顯示的修改其.o
檔案路徑。
獲取專案
關於如此管理專案,我在網上提供的完整的例子,可以從 GitHub 1 上面下載,包含了一個完整 HelloWorld 工程專案。可以從這理獲取,其中Android.mk 和 Makefile 檔案可以直接使用。
如果你是在 Windows 下使用 cygwin 編譯,那麼這篇文章只能作為參考,其也是 unix 環境的一個模擬,但這裡並不能確定其過程是否會出現什麼問題。
相關推薦
cocos2d-x 交叉編譯,維護mk檔案的“萬能”配置解決(轉載)
之前研究cocos2d-x的環境,大部分網上教程都沒提mk檔案的配置怎麼適應大專案的情況,都是以幾個檔案的專案在做demo演示,最近專案越來越大,在用手動配置mk檔案的話,是件很不科學的事,於是找到了這篇文章,留下學習的足跡,同時與大家分享。 Makefile Andro
谷歌通過ajax獲取本地JSON檔案,為什麼會提示跨域?(轉載)
https://blog.csdn.net/jiaoshuaiai/article/details/78417683 在本地寫了一段JSON程式碼,然後用ajax讀取後,在瀏覽器開啟,發現谷歌提示涉及到跨域問題, 但是跨域是由於協議,域名,埠中有一個不同,才會跨域,我在本地訪問自己的檔
Quick-Cocos2d-x 3.3繫結自定義類至Lua(三)動手繫結自定義類至Lua
看【繫結自定義類至Lua】(二)新建專案中配製環境新建專案中配製環境,我們完美的在新建專案中完成了繫結需要的環境,接下來才是最關健的一步。繫結自定義C++類至Lua。 事實上引擎為了方便我們應對不同平臺,已經幫我們建立了不同平臺的工程專案。為了編輯程式碼方便,我
畢業後短時間內月薪翻倍的人,都經歷了什麽?(轉載)
... 讓我 經驗 不能 企業 成就感 薪水高 單位 and 畢業季,現在應屆生們坐在一起討(tu)論(cao)的,都是自己的新單位,和職場上那些新鮮又不知所措的第一次。 我們不畫成就感/自我實現的大餅,對於大多數的俗人來說,工作就是為了賺錢,尤其是對於剛畢業的學生,必然是
Java中的break,continue關於標簽的用法(轉載)
src 標識符 流程控制 循環 結束 其他 而不是 來看 結果 Java的控制循環結構中是沒有關鍵字goto的,這種做法有它的好處,它提高了程序流程控制的可讀性,但是也有不好的地方,它降低了程序流程控制的靈活性,所以說,“上帝是公平的”。所以,Java為了彌補這方面的不
電商等大型網站高可用,高負載架構借鑒方案(轉載)
切分 繼續 發生 一個數據庫 用戶 其中 取數 特點 動靜 任何一個大型網站都是經歷用戶積累然後成長,從一臺服務器到多臺服務器才能構架支撐網站現有數據、用戶、頁面請求等。大型網站(如淘寶、京東等)的系統架構並不是開始設計就具備完整的高性能、高可用、安全等特性,它總是隨著用戶
新增Udev規則,讓Linux自動掛載U盤(轉載)
如果你使用Linux比較長時間了,那你就知道,在對待裝置檔案這塊,Linux改變了幾次策略。在Linux早期,裝置檔案僅僅是是一些帶有適當的屬性集的普通檔案,它由mknod命令建立,檔案存放在/dev目錄下。後來,採用了devfs,一個基於核心的動態裝置檔案系統,他首次出現在2.3.46核心中。Mandrak
Centos7 grub的配置檔案及排錯 (轉載)
與Centos6不同Centos7採用的是grub2,而不是grub。在Centos7中,把grub的主要配置檔案放在以下三個地方。/boot/grub2/grub.cfg (/etc/grub2.cfg 是/boot/grub2/grub.cfg 檔案的符號連結)/etc/grub.d//etc/
Git如何永久刪除檔案(包括歷史記錄)(轉載)
轉自:https://www.cnblogs.com/shines77/p/3460274.html有些時候不小心上傳了一些敏感檔案(例如密碼), 或者不想上傳的檔案(沒及時或忘了加到.gitignore裡的),而且上傳的檔案又特別大的時候, 這將導致別人clone你的程式碼
linux下開發,解決cocos2d-x中編譯出現的一個小問題, undefined reference to symbol 'pthread_create@@GLIBC_2.2.5'
water span x86 code bject data- ace 技術分享 inux 解決cocos2d-x中編譯出現的一個小問題 對於cocos2d-x 2.×中編譯中,若頭文件裏引入了#include "cocos-ext.h",在進行C++編譯的時候會遇到例
live555在arm linux下的交叉編譯,並下載的Arm板播放H264檔案
我的系統是ubuntu 11.10 1.live555原始碼 和 H264測試檔案下載 ,見如下連結 2.根據自己的交叉編譯器修改config.*(具體見下載檔案中的config.armeb-uclibc), 我的編譯器是buildroot-gcc342-----mi
交叉編譯,為什麽需要交叉編譯
ava 通過 運行速度 磁盤空間 要花 嵌入式系統 nbsp 工具 磁盤 本地編譯 本地編譯可以理解為,在當前編譯平臺下,編譯出來的程序只能放到當前平臺下運行。平時我們常見的軟件開發,都是屬於本地編譯: 比如,我們在 x86 平臺上,編寫程序並編譯成可執行程序。這種方式下,
os X macOS 開發,Preferences setting 檔案位置
Where is a Mac Application's NSUserDefaults Data Stored? https://stackoverflow.com/questions/7982740/where-is-a-mac-applications-nsuserdefaults-data
Cocos2d-x Lua 訪問plist屬性列表檔案
C++: //載入plist檔案 config = CCDictionary::createWithContentsOfFile(path); config->retain(); //訪問其中元素 CCArray *a
mips-linux-gcc交叉編譯,kubernetes中pause二進位制資訊
一、編譯說明 剛接觸Kubernetes,便知道叢集搭建需要下載一個gcr.io/google_containers/pause-amd64:3.0映象,然後每次啟動一個容器,都會伴隨一個pause容器的啟動,pause是每個pod需要的根映象。 遇到這種情況我們都是通過
什麼是交叉編譯,為什麼要使用交叉編譯?
一、什麼是交叉編譯 在一種計算機環境中執行的編譯程式,能編譯出在另外一種環境下執行的程式碼,我們就稱這種編譯器支援交叉編譯。這個編譯過程就叫交叉編譯。簡單地說,就是在一個平臺上生成另一個平臺上的可執行程式碼。這裡需要注意的是所謂平臺,實際上包含兩個概念:體系結構(
Cocos2d-x,IOS,遊戲,開發/交流/學習/資源 馬宗揚
此篇文章獻給初學遊戲設計的開發者,希望能夠幫助同學們各好的瞭解遊戲與引擎。 1. 什麼是遊戲 遊戲的型別有很多種,而今天我們所談,無疑是電子遊戲。 對於一般的開發者而言,遊戲無非就是程式的代名詞,一款遊戲在研發人員的眼中恐怕與一般的軟體開發無異,然而遊戲的意義真
quick-cocos2d-x原始檔編譯及加密詳解
quick-cocos2d-x是用lua指令碼來寫的,而lua是明文形式,如果不對指令碼進行處理,那麼我們所寫的程式碼將可能暴露給別人(apk和ipa都是簡單的zip包裝)。 quick-cocos2d-x框架為我們提供了一個可編譯和加密程式碼的工具compile_scr
openssh 在arm linux 嵌入式平臺交叉編譯,100%成功執行
本文真實地址:http://blog.csdn.net/code_style/article/details/61928328 2、交叉編譯環境:arm-linux-gnueabi-gcc 4.
條件編譯,標頭檔案,靜態庫,共享庫與多檔案程式設計
本文轉自嵌入式Linux中文站 條件編譯 條件編譯即滿足某些條件的時候編譯某部分程式碼,常用於開發多個版本的程式,當滿足條件A時,編譯出免費版本的軟體,當滿足條件B時,編譯除vip版本的軟體,可以提高程式碼的複用率。條件編譯使用"預處理命令+巨集定義"來實現,更多巨集