1. 程式人生 > >cocos2d-x 交叉編譯,維護mk檔案的“萬能”配置解決(轉載)

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中的breakcontinue關於標簽的用法轉載

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 &#39;pthread_create@@GLIBC_2.2.5&#39;

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版本的軟體,可以提高程式碼的複用率。條件編譯使用"預處理命令+巨集定義"來實現,更多巨集