Cocos2dx v3.8.1避免重复编译

Platform: Android or Windows

Windows平台

  • Visual Studio 2013

引用地址: http://blog.csdn.net/u014335219/article/details/50492088

Cocos2dx新建一个工程就会重新编译,而且在VS中,release模式下即便一些库文件未做任何修改(例如libbox2d.lib, libSpine.lib等,也就是库文件的源码未做任何改动),在这个模式下也会重新编译,导致十几分钟的编译时间,debug模式情况却不会对未做修改的库进行再次编译, 下面先介绍VS2013下release模式下的情况,debug模式下和release模式几乎一样,这样做也可以减少新建工程时的第一次编译时间

新建一个工程

cocos new cpp-cocosbuilt -p com.cocos.built -l cpp -d .

新建cpp-cocosbuilt项目后,用VS2013打开proj.win32/cpp-cocosbuilt.sln, 因为release模式会出现这种情况,所以我们将VS2013调到这种模式,如下图所示:

然后ctrl + F5,直接编译和运行,第一遍运行肯定就会是下图这样的

生成预编译库

使用Cocos2dx console控制台命令,选项可通过cocos gen-libs -h查看

cocos gen-libs -p win32 -m release --vs2013

这是产生预编译库的命令,可以产生Android或Win32等平台的预编译库,避免重复编译,执行后,会在cocos引擎上级目录产生一个prebuilt文件夹,我的编译的库目录如下图所示:

移除项目引用

右键项目-属性-通用属性-引用,如下图,移除椭圆2中库的所有引用

移除解决方案引用

接着右键解决方案-属性-通用属性-项目依赖项,将右边库前面的复选框全部取消选中,如下图所示

注意:如果出现如下图所示的不能移除问题,是你没有做前一步移除引用操作,请返回3步骤

配置环境

添加库目录,并设置libcocos2d_2013.dll的环境变量, 如下图所示, 这个目录就是上面的预编译库的目录

然后添加libcocos2d_2013.lib库

接下来是设置dll环境变量,把该变量添加到Path中.

然后就可以ctrl + F5,就可以成功运行啦!

debug模式

同样在cpp-cocosbuilt项目下测试,生成预编译库

cocos gen-libs -p win32 -m debug --vs2013

PS: 使用-c选项会清除$(COCOS_ROOT)/prebuilt目录所有文件,重新生成预编译库. 其他步骤同Release模式,区别只在于,debug模式,附加依赖项多了libbox2d.lib以及libSpine.lib,同时需要修改prebuilt/win32目录下libbox2d_2013.lib以及libSpine_2013.lib,修改为libbox2d.lib及libSpine.lib

建议:debug模式不采用上面步骤,release模式使用上面步骤,原因是如果同时存在debug模式以及Release模式的dll,配置环境变量会产生冲突,而且debug模式在程序运行时也只需编译一遍,只会增加第一次编译时间

Android平台

  • Android Studio

修改proj.android-studio/app/jni目录下的Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
# 注释掉之前的模块路径
#$(call import-add-path,$(LOCAL_PATH)/../../../cocos2d)
#$(call import-add-path,$(LOCAL_PATH)/../../../cocos2d/external)
#$(call import-add-path,$(LOCAL_PATH)/../../../cocos2d/cocos)
# 添加下面的新模块路径
$(call import-add-path,$(COCOS_ROOT))

LOCAL_MODULE := cocos2dcpp_shared

LOCAL_MODULE_FILENAME := libcocos2dcpp

LOCAL_SRC_FILES := hellocpp/main.cpp \
                   ../../../Classes/AppDelegate.cpp \
                   ../../../Classes/HelloWorldScene.cpp

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../../Classes
LOCAL_C_INCLUDES += $(COCOS_ROOT)/cocos
# _COCOS_HEADER_ANDROID_BEGIN
# _COCOS_HEADER_ANDROID_END

LOCAL_STATIC_LIBRARIES := cocos2dx_static

# _COCOS_LIB_ANDROID_BEGIN
# _COCOS_LIB_ANDROID_END

include $(BUILD_SHARED_LIBRARY)

# 注释掉之前的模块路径
#$(call import-module,.)
# 添加下面的新模块路径
$(call import-module, prebuilt/android)

# _COCOS_LIB_IMPORT_ANDROID_BEGIN
# _COCOS_LIB_IMPORT_ANDROID_END

以后新建项目只要修改新工程的jni/Android.mk文件就行了,接下来我们在$(COCOS_ROOT)/prebuilt/android目录下新建一个Android.mk文件

### COCOS 预编译静态库,确保环境变量有COCOS_ROOT或者项目里有

# 文件位置 $(COCOS_ROOT)/prebuild/android
LOCAL_PATH := $(call my-dir)

#$(call import-add-path,$(COCOS_ROOT))
$(call import-add-path,$(COCOS_ROOT)/external)
$(call import-add-path,$(COCOS_ROOT)/cocos)

#==============================================================
include $(CLEAR_VARS)

LOCAL_MODULE := cocos2dx_static
LOCAL_MODULE_FILENAME := libcocos2d

LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libcocos2d.a
LOCAL_EXPORT_C_INCLUDES := \
    $(COCOS_ROOT)/cocos \
    $(COCOS_ROOT)/cocos/platform/android
LOCAL_STATIC_LIBRARIES := cocostudio_static
LOCAL_STATIC_LIBRARIES += cocosbuilder_static
LOCAL_STATIC_LIBRARIES += cocos3d_static
LOCAL_STATIC_LIBRARIES += spine_static
LOCAL_STATIC_LIBRARIES += cocos_network_static
LOCAL_STATIC_LIBRARIES += audioengine_static

include $(PREBUILT_STATIC_LIBRARY)
#include $(BUILD_STATIC_LIBRARY)

#==============================================================
include $(CLEAR_VARS)

LOCAL_MODULE := cocos_ui_static
LOCAL_MODULE_FILENAME := libui
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libui.a
LOCAL_EXPORT_C_INCLUDES := \
    $(COCOS_ROOT)/cocos/ui \
    $(COCOS_ROOT)/cocos/editor-support
LOCAL_C_INCLUDES := \
    $(COCOS_ROOT)/cocos/ui \
    $(COCOS_ROOT)/cocos/editor-support
LOCAL_STATIC_LIBRARIES := cocos_extension_static

include $(PREBUILT_STATIC_LIBRARY)
                    
#==============================================================
include $(CLEAR_VARS)

LOCAL_MODULE := cocos_flatbuffers_static
LOCAL_MODULE_FILENAME := flatbuffers
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/flatbuffers.a
LOCAL_EXPORT_C_INCLUDES := \
    $(COCOS_ROOT)/external

LOCAL_C_INCLUDES := \
    $(COCOS_ROOT)/external \
    $(COCOS_ROOT)/external/flatbuffers

include $(PREBUILT_STATIC_LIBRARY)
#==============================================================
include $(CLEAR_VARS)

LOCAL_MODULE := cocos_extension_static
LOCAL_MODULE_FILENAME := libextension
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libextension.a

LOCAL_STATIC_LIBRARIES := cocos2dx_internal_static
LOCAL_STATIC_LIBRARIES += cocos_curl_static
LOCAL_STATIC_LIBRARIES += box2d_static
LOCAL_STATIC_LIBRARIES += bullet_static
LOCAL_STATIC_LIBRARIES += cocos_network_static

LOCAL_CXXFLAGS += -fexceptions
LOCAL_C_INCLUDES := \
    $(COCOS_ROOT) \
    $(COCOS_ROOT)/extensions
LOCAL_EXPORT_C_INCLUDES := \
    $(COCOS_ROOT) \
    $(COCOS_ROOT)/extensions \
    $(COCOS_ROOT)/extensions/GUI/CCControlExtension \
    $(COCOS_ROOT)/extensions/GUI/CCScrollView \
    $(COCOS_ROOT)/cocos/network
include $(PREBUILT_STATIC_LIBRARY)

#==============================================================
include $(CLEAR_VARS)

LOCAL_MODULE := cocos2dx_internal_static
LOCAL_MODULE_FILENAME := libcocos2dxinternal
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libcocos2dxinternal.a
LOCAL_EXPORT_C_INCLUDES := \
    $(COCOS_ROOT)/cocos \
    $(COCOS_ROOT) \
    $(COCOS_ROOT)/cocos/platform \
    $(COCOS_ROOT)/cocos/base \
    $(COCOS_ROOT)/external \
    $(COCOS_ROOT)/external/tinyxml2 \
    $(COCOS_ROOT)/external/unzip \
    $(COCOS_ROOT)/external/chipmunk/include/chipmunk \
    $(COCOS_ROOT)/external/xxhash \
    $(COCOS_ROOT)/external/nslog \
    $(COCOS_ROOT)/external/poly2tri \
    $(COCOS_ROOT)/external/poly2tri/common \
    $(COCOS_ROOT)/external/poly2tri/sweep \
    $(COCOS_ROOT)/external/clipper

LOCAL_C_INCLUDES := \
    $(COCOS_ROOT)/cocos/platform \
    $(COCOS_ROOT)/external \
    $(COCOS_ROOT)/external/tinyxml2 \
    $(COCOS_ROOT)/external/unzip \
    $(COCOS_ROOT)/external/chipmunk/include/chipmunk \
    $(COCOS_ROOT)/external/edtaa3func \
    $(COCOS_ROOT)/external/xxhash \
    $(COCOS_ROOT)/external/ConvertUTF \
    $(COCOS_ROOT)/external/nslog \
    $(COCOS_ROOT)/external/poly2tri \
    $(COCOS_ROOT)/external/poly2tri/common \
    $(COCOS_ROOT)/external/poly2tri/sweep \
    $(COCOS_ROOT)/external/clipper

LOCAL_EXPORT_LDLIBS := -lGLESv2 -llog -landroid

LOCAL_STATIC_LIBRARIES := cocos_freetype2_static
LOCAL_STATIC_LIBRARIES += cocos_png_static
LOCAL_STATIC_LIBRARIES += cocos_jpeg_static
LOCAL_STATIC_LIBRARIES += cocos_tiff_static
LOCAL_STATIC_LIBRARIES += cocos_webp_static
LOCAL_STATIC_LIBRARIES += cocos_chipmunk_static
LOCAL_STATIC_LIBRARIES += cocos_zlib_static
LOCAL_STATIC_LIBRARIES += recast_static
LOCAL_STATIC_LIBRARIES += bullet_static

LOCAL_WHOLE_STATIC_LIBRARIES := cocos2dxandroid_static

# define the macro to compile through support/zip_support/ioapi.c
LOCAL_CFLAGS   :=  -DUSE_FILE32API
LOCAL_CFLAGS   +=  -fexceptions
LOCAL_CPPFLAGS := -Wno-deprecated-declarations -Wno-extern-c-compat
LOCAL_EXPORT_CFLAGS   := -DUSE_FILE32API
LOCAL_EXPORT_CPPFLAGS := -Wno-deprecated-declarations -Wno-extern-c-compat

include $(PREBUILT_STATIC_LIBRARY)

#==============================================================
include $(CLEAR_VARS)

LOCAL_MODULE := cocostudio_static
LOCAL_MODULE_FILENAME := libcocostudio
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libcocostudio.a
LOCAL_EXPORT_C_INCLUDES := \
    $(COCOS_ROOT)/cocos/editor-support \
    $(COCOS_ROOT)/cocos/editor-support/cocostudio
LOCAL_C_INCLUDES := \
    $(COCOS_ROOT)/cocos/editor-support \
    $(COCOS_ROOT)/cocos/editor-support/cocostudio \
    $(COCOS_ROOT)/cocos/editor-support/cocostudio/WidgetReader \
    $(COCOS_ROOT)/cocos/editor-support/cocostudio/ActionTimeline \
LOCAL_STATIC_LIBRARIES := cocos_ui_static
LOCAL_STATIC_LIBRARIES += cocosdenshion_static
LOCAL_STATIC_LIBRARIES += cocos_flatbuffers_static

include $(PREBUILT_STATIC_LIBRARY)

#==============================================================
include $(CLEAR_VARS)

LOCAL_MODULE := cocosbuilder_static
LOCAL_MODULE_FILENAME := libcocosbuilder
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libcocosbuilder.a
LOCAL_EXPORT_C_INCLUDES := \
    $(COCOS_ROOT)/cocos/editor-support
LOCAL_C_INCLUDES := \
    $(COCOS_ROOT)/cocos/editor-support \
    $(COCOS_ROOT)/cocos/2d \
LOCAL_STATIC_LIBRARIES := cocos_extension_static

include $(PREBUILT_STATIC_LIBRARY)

#==============================================================
include $(CLEAR_VARS)

LOCAL_MODULE := spine_static
LOCAL_MODULE_FILENAME := libspine
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libspine.a
LOCAL_EXPORT_C_INCLUDES := \
    $(COCOS_ROOT)/cocos/editor-support
LOCAL_C_INCLUDES := \
    $(COCOS_ROOT)/cocos/editor-support
LOCAL_STATIC_LIBRARIES := cocos2dx_internal_static

include $(PREBUILT_STATIC_LIBRARY)

#==============================================================
include $(CLEAR_VARS)

LOCAL_MODULE := cocos3d_static
LOCAL_MODULE_FILENAME := libcocos3d
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libcocos3d.a
LOCAL_EXPORT_C_INCLUDES := \
    $(COCOS_ROOT)/cocos
LOCAL_C_INCLUDES := \
    $(COCOS_ROOT)/cocos
LOCAL_STATIC_LIBRARIES := cocos2dx_internal_static

include $(PREBUILT_STATIC_LIBRARY)

#==============================================================
include $(CLEAR_VARS)

LOCAL_MODULE := box2d_static
LOCAL_MODULE_FILENAME := libbox2d
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libbox2d.a
LOCAL_EXPORT_C_INCLUDES := $(COCOS_ROOT)/external
LOCAL_C_INCLUDES := $(COCOS_ROOT)/external \
    $(COCOS_ROOT)/external/Box2D
include $(PREBUILT_STATIC_LIBRARY)

#==============================================================
include $(CLEAR_VARS)

LOCAL_MODULE := recast_static
LOCAL_MODULE_FILENAME := librecast
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/librecast.a
LOCAL_EXPORT_C_INCLUDES := \
    $(COCOS_ROOT)/external
LOCAL_C_INCLUDES := \
    $(COCOS_ROOT)/external

include $(PREBUILT_STATIC_LIBRARY)

#==============================================================
include $(CLEAR_VARS)

LOCAL_MODULE := bullet_static
LOCAL_MODULE_FILENAME := libbullet
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libbullet.a
LOCAL_EXPORT_C_INCLUDES := \
    $(COCOS_ROOT)/external
LOCAL_C_INCLUDES := \
    $(COCOS_ROOT)/external

include $(PREBUILT_STATIC_LIBRARY)
#==============================================================
include $(CLEAR_VARS)

LOCAL_MODULE := cocos_network_static
LOCAL_MODULE_FILENAME := libnetwork
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libnetwork.a
LOCAL_EXPORT_C_INCLUDES :=

LOCAL_C_INCLUDES := \
    $(COCOS_ROOT)/external/curl/include/android \
    $(COCOS_ROOT)/external/websockets/include/android

LOCAL_STATIC_LIBRARIES := cocos2dx_internal_static
LOCAL_STATIC_LIBRARIES += cocos_curl_static
LOCAL_STATIC_LIBRARIES += libwebsockets_static

include $(PREBUILT_STATIC_LIBRARY)
#==============================================================
include $(CLEAR_VARS)

LOCAL_MODULE := cocos2dxandroid_static
LOCAL_MODULE_FILENAME := libcocos2dandroid
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libcocos2dandroid.a
LOCAL_EXPORT_C_INCLUDES := \
    $(COCOS_ROOT)/cocos/platform/android \
LOCAL_C_INCLUDES := \
    $(COCOS_ROOT)/cocos/platform/android \
    $(COCOS_ROOT)/cocos/platform \
    $(COCOS_ROOT)/cocos
LOCAL_EXPORT_LDLIBS := -lGLESv1_CM \
                       -lGLESv2 \
                       -lEGL \
                       -llog \
                       -landroid

LOCAL_CPPFLAGS := -Wno-extern-c-compat

LOCAL_EXPORT_CPPFLAGS := -Wno-extern-c-compat
include $(PREBUILT_STATIC_LIBRARY)
#========AudioEngine库加入失败因为本身存在编译警告========
#New AudioEngine
#include $(CLEAR_VARS)
#LOCAL_MODULE := audioengine_static

#LOCAL_MODULE_FILENAME := libaudioengine

#LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libaudioengine.a

#LOCAL_EXPORT_C_INCLUDES := $(COCOS_ROOT)/cocos/audio/include
#LOCAL_EXPORT_LDLIBS := -lOpenSLES
#LOCAL_C_INCLUDES := $(COCOS_ROOT)/cocos/audio/include \
                    $(COCOS_ROOT)/cocos \
                    $(COCOS_ROOT)/cocos/audio/platform/android

#include $(PREBUILT_STATIC_LIBRARY)
#SimpleAudioEngine
#include $(CLEAR_VARS)

#LOCAL_MODULE := cocosdenshion_static
#LOCAL_MODULE_FILENAME := libcocosdenshion
#LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libcocosdenshion.a
#LOCAL_STATIC_LIBRARIES := audioengine_static
#LOCAL_EXPORT_C_INCLUDES := $(COCOS_ROOT)/cocos/audio/include

#LOCAL_C_INCLUDES := $(COCOS_ROOT)/cocos/audio/include \
                    $(COCOS_ROOT)/cocos \
                    $(COCOS_ROOT)/cocos/audio/platform/android

#include $(PREBUILT_STATIC_LIBRARY)

#==============================================================
##以下是cocos编译好的静态库
#==============================================================
$(call import-module,freetype2/prebuilt/android)
$(call import-module,png/prebuilt/android)
$(call import-module,zlib/prebuilt/android)
$(call import-module,jpeg/prebuilt/android)
$(call import-module,tiff/prebuilt/android)
$(call import-module,webp/prebuilt/android)
$(call import-module,chipmunk/prebuilt/android)
$(call import-module,curl/prebuilt/android)
$(call import-module,websockets/prebuilt/android)
#==============================================================
#AudioEngine在这里加入编译
$(call import-module,audio/android)

然后就可以在命令行下编译了

cocos compile -p android --android-studio