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 Android.mk 引发的思索的更多相关文章
- 解决 Cocos2d-x 中 Android.mk 手动添加源文件
转自:http://blog.csdn.net/ypfsoul/article/details/8909178 Makefile Android.mk 引发的思索 在我们编写 Android 平台 c ...
- Android.mk 文件语法详解
0. Android.mk简介: Android.mk文件用来告知NDK Build 系统关于Source的信息. Android.mk将是GNU Makefile的一部分,且将被Build Syst ...
- Android.mk 文件语法详解 转:http://blog.sina.com.cn/s/blog_602f8770010148ce.html
0. Android.mk简介: Android.mk文件用来告知NDK Build 系统关于Source的信息. Android.mk将是GNU Makefile的一部分,且将被Build Syst ...
- Android JNI入门第四篇——Android.mk文件分析
ndroid.mk文件是在使用NDK编译C代码时必须的文件,Android.mk文件中描述了哪些C文件将被编译且指明了如何编译.掌握Android.mk文件的编写主要是掌握其里头将要使用的一些关键字, ...
- Android JNI的Android.mk文件语法详解
Android.mk简介: Android.mk文件用来告知NDK Build 系统关于Source的信息. Android.mk将是GNU Makefile的一部分,且将被Build System解 ...
- zz android 系统 makefile文件(Android.mk)组织结构
Android.mk脚本结构 下面是main.mk文件包含关系,本文档主要说明的就是这些文件里到底做了什么.(这个文件被根目录下的makefile文件包含) 一. main.mk 1.检查版本 ...
- android编译系统的makefile文件Android.mk写法如下
(1)Android.mk文件首先需要指定LOCAL_PATH变量,用于查找源文件.由于一般情况下Android.mk和需要编译的源文件在同一目录下,所以定义成如下形式:LOCAL_PATH:=$(c ...
- linux和Android的Makefile和android.mk
1. makefile 1.1 gcc的参数 -Wall: 是打开警告开关, -O: 代表默认优化,可选:-O0不优化,-O1低级优化,-O2中级优化,-O3高级优化,-Os代码空间优化. -g ...
- makefile 与android.mk中加信息打印
makefile里面加打印: [table]@echo ' zImage - Compressed kernel image' android.mk里面加信息打印: $(warning TEXT... ...
随机推荐
- WPF DataGridHyperlinkColumn
为了点击链接,我们使用 <DataGrid x:Name="data" LoadingRow="load" ItemsSource="{Bind ...
- 三种方式设置特定设备UWP XAML view
开发者可以设置UWP特定设备xaml view,在桌面,手机,Iot,这个对于设置对不同设备的不同屏幕有用.我们可以使用RelativePanel,VisualStateTriggers,但是这样我们 ...
- coursera_poj_魔兽世界终结版
五个下午的时间!!!!终于过了!!有史以来做的最复杂的一个题这是我迄今为止做的最复杂也最具有挑战的一个oj作业.虽然之前做过比这个规模一些作业项目,但是往往有简单的模块框架,模块之前的关系也只是有些简 ...
- 使用vsftpd+nginx搭建一个文件服务器
一:安装vsftpd 1.安装 [root@localhost jack]# yum -y install vsftpd 安装完后,有/etc/vsftpd/vsftpd.conf 文件,是vsftp ...
- 正六边形网格化(Hexagonal Grids)原理与实现
在路径规划.游戏设计栅格法应用中,正六边形网格不如矩形网格直接和常见,但是正六边形具有自身的应用特点,更适用于一些特殊场景中,比如旷阔的海洋.区域或者太空.本文主要讲述如何对正六边形进行几何学分析.网 ...
- 新建JSPWeb应用
首先,在eclipse Java EE里新建项目,选择Dynamic Web Project 目录如图所示,在WebContent里建立新文件JSP File. 先在body标签里写入hello wo ...
- Redis主从环境配置
1.Redis主从同步原理 redis主服务器会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,然后将数据文件同步给从服务器,从服务器加载记录文件,在内存库中更新新数据. 2.VMWar ...
- Redis环境搭建
一.准备的安装包 windows虚拟机软件:VMware Workstation Pro 12 linux安装文件:CentOS-7-x86_64-Minimal-1511.iso 远程登录软件:pu ...
- C语言(记录)——内存相关_2:内存的编址与管理
本文是基于嵌入式的C语言 --------------------------------------------------------------------------------------- ...
- gsoap入门实例
环境VS2008,gsoap_2.8,win7 实例场景:在客户端输入一个字符串,然后传递给服务端计算字符串长度并返回给客户端(附加一些加减乘除法的实现): 将..\gsoap-2.8\gsoap\b ...