Cocos2d-x 3.0 beta2 for android 使用gui library编译出错

在eclipse中生成android版本的cocos2d-x 游戏,使用cocos2d-x 3.0 beta2。在程序中使用了控件(Text、Checkbox等)。但linker时出错,而同样的程序,ios是好使的。首先Android.mk中所有的.cpp文件肯定是都引用了。然后将xcode中的所有header include都放到Android.mk文件中的。并且android.mk文件的其他内容如下:

… 省略了前面的内容…

LOCAL_C_INCLUDES := (LOCAL_PATH)/../../Classes LOCAL_C_INCLUDES += (LOCAL_PATH)/…/…/cocos2d/extensions
LOCAL_C_INCLUDES += (LOCAL_PATH)/../../cocos2d/extensions/GUI/CCControlExtension LOCAL_C_INCLUDES += (LOCAL_PATH)/…/…/cocos2d/cocos
LOCAL_C_INCLUDES += (LOCAL_PATH)/../../cocos2d/cocos/base LOCAL_C_INCLUDES += (LOCAL_PATH)/…/…/cocos2d/cocos/physics
LOCAL_C_INCLUDES += (LOCAL_PATH)/../../cocos2d/cocos/math/kazmath/include LOCAL_C_INCLUDES += (LOCAL_PATH)/…/…/cocos2d/cocos/2d
LOCAL_C_INCLUDES += (LOCAL_PATH)/../../cocos2d/extensions/GUI/CCScrollView LOCAL_C_INCLUDES += (LOCAL_PATH)/…/…/cocos2d/external/chipmunk/include/chipmunk
LOCAL_C_INCLUDES += (LOCAL_PATH)/../../cocos2d/cocos/editor-support LOCAL_C_INCLUDES += (LOCAL_PATH)/…/…/cocos2d/cocos/audio/include
LOCAL_C_INCLUDES += (LOCAL_PATH)/../../cocos2d/cocos/network LOCAL_C_INCLUDES += (LOCAL_PATH)/…/…/cocos2d/cocos/gui

LOCAL_WHOLE_STATIC_LIBRARIES := cocos2dx_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocosdenshion_static
LOCAL_WHOLE_STATIC_LIBRARIES += box2d_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocos_extension_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocos_gui_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocosbuilder_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocostudio_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocos_network_static

include $(BUILD_SHARED_LIBRARY)

(call import-module,2d) (call import-module,audio/android)
(call import-module,Box2D) (call import-module,extensions)
(call import-module,gui) (call import-module,editor-support/cocosbuilder)
$(call import-module,editor-support/cocostudio)

最后编译链接出现如下错误

SharedLibrary : libcocos2dcpp.so
./obj/local/armeabi/libextension.a(CCControl.o):CCControl.cpp:function vtable for cocos2d::extension::Control: error: undefined reference to ‘cocos2d::Node::setLocalZOrder(int)’
make: Leaving directory `/MyStudio/cocos2d-x/books/Cocos2dx_Game_Unleashed/Cocos2dxDemo/proj.android’
./obj/local/armeabi/libextension.a(CCControl.o):CCControl.cpp:function vtable for cocos2d::extension::Control: error: undefined reference to ‘cocos2d::Node::_setLocalZOrder(int)’
The Selected NDK toolchain version was 4.7 !
./obj/local/armeabi/libextension.a(CCControl.o):CCControl.cpp:function vtable for cocos2d::extension::Control: error: undefined reference to ‘cocos2d::Node::setGlobalZOrder(float)’
./obj/local/armeabi/libextension.a(CCControlHuePicker.o):CCControlHuePicker.cpp:function vtable for cocos2d::extension::ControlHuePicker: error: undefined reference to ‘cocos2d::Node::setLocalZOrder(int)’
./obj/local/armeabi/libextension.a(CCControlHuePicker.o):CCControlHuePicker.cpp:function vtable for cocos2d::extension::ControlHuePicker: error: undefined reference to ‘cocos2d::Node::_setLocalZOrder(int)’
./obj/local/armeabi/libextension.a(CCControlHuePicker.o):CCControlHuePicker.cpp:function vtable for cocos2d::extension::ControlHuePicker: error: undefined reference to ‘cocos2d::Node::setGlobalZOrder(float)’
./obj/local/armeabi/libextension.a(CCControlPotentiometer.o):CCControlPotentiometer.cpp:function vtable for cocos2d::extension::ControlPotentiometer: error: undefined reference to ‘cocos2d::Node::setLocalZOrder(int)’
./obj/local/armeabi/libextension.a(CCControlPotentiometer.o):CCControlPotentiometer.cpp:function vtable for cocos2d::extension::ControlPotentiometer: error: undefined reference to ‘cocos2d::Node::_setLocalZOrder(int)’
./obj/local/armeabi/libextension.a(CCControlPotentiometer.o):CCControlPotentiometer.cpp:function vtable for cocos2d::extension::ControlPotentiometer: error: undefined reference to ‘cocos2d::Node::setGlobalZOrder(float)’
./obj/local/armeabi/libextension.a(CCControlSaturationBrightnessPicker.o):CCControlSaturationBrightnessPicker.cpp:function vtable for cocos2d::extension::ControlSaturationBrightnessPicker: error: undefined reference to ‘cocos2d::Node::setLocalZOrder(int)’
./obj/local/armeabi/libextension.a(CCControlSaturationBrightnessPicker.o):CCControlSaturationBrightnessPicker.cpp:function vtable for cocos2d::extension::ControlSaturationBrightnessPicker: error: undefined reference to ‘cocos2d::Node::_setLocalZOrder(int)’
./obj/local/armeabi/libextension.a(CCControlSaturationBrightnessPicker.o):CCControlSaturationBrightnessPicker.cpp:function vtable for cocos2d::extension::ControlSaturationBrightnessPicker: error: undefined reference to ‘cocos2d::Node::setGlobalZOrder(float)’
/MyStudio/cocos2d-x/books/Cocos2dx_Game_Unleashed/Cocos2dxDemo/proj.android/…/cocos2d/extensions/GUI/CCScrollView/CCScrollView.cpp:532: error: undefined reference to ‘cocos2d::CustomCommand::init(float)’
/MyStudio/cocos2d-x/books/Cocos2dx_Game_Unleashed/Cocos2dxDemo/proj.android/…/cocos2d/extensions/GUI/CCScrollView/CCScrollView.cpp:497: error: undefined reference to ‘cocos2d::CustomCommand::init(float)’
/MyStudio/cocos2d-x/books/Cocos2dx_Game_Unleashed/Cocos2dxDemo/proj.android/…/cocos2d/cocos/2d/CCDirector.cpp:382: error: undefined reference to ‘cocos2d::Configuration::dumpInfo() const’
collect2: error: ld returned 1 exit status
make: *** Error 1
Traceback (most recent call last):
File “/MyStudio/cocos2d-x/books/Cocos2dx_Game_Unleashed/Cocos2dxDemo/proj.android/build_native.py”, line 147, in
build(opts.ndk_build_param,opts.android_platform,opts.build_mode)
File “/MyStudio/cocos2d-x/books/Cocos2dx_Game_Unleashed/Cocos2dxDemo/proj.android/build_native.py”, line 134, in build
do_build(cocos_root, ndk_root, app_android_root,ndk_build_param,sdk_root,android_platform,build_mode)
File “/MyStudio/cocos2d-x/books/Cocos2dx_Game_Unleashed/Cocos2dxDemo/proj.android/build_native.py”, line 70, in do_build
raise Exception(“Build dynamic library for project " + app_android_root + " ] fails!”)
Exception: Build dynamic library for project /MyStudio/cocos2d-x/books/Cocos2dx_Game_Unleashed/Cocos2dxDemo/proj.android ] fails!

10:22:50 Build Finished (took 58s.939ms)


Android.mk还需要引用什么吗?

说实话,你的问题跟我的问题是有区别的,http://www.cocoachina.com/bbs/read.php?tid=182285&page=2这里面我的解决办法我自己用是可以的,但是我的异常是找不到头文件或者文件夹,但是你的异常是未定义引用,你的改动跟我的改动的区别在于,你还改了LOCAL_C_INCLUDES,我怀疑会不会因为文件重复编译导致了编译异常,你不妨试下只改动下面两个,LOCAL_C_INCLUDES只保留第一行试试

但这些include,是xcode中的,移过来的,xcode也是使用C++编译啊,都没有重复的问题,为什么android会有问题呢,以前都没有,直到用了gui library。还有cocos2d-x团队应该送佛送到西,xcode的工程引用弄的很完善,为什么android工程模板弄得缺这个少这个。应该提供个完整的android.mk,到底应该如何引用,否则自己挨个试,很费事!

C++很多编译和linker错误描述实际上并不是根源的错误,所以很多时候很不好确定到底是什么原因!不像java、c#,基本上根据错误很容易定义。哎。正好明天下午cocos2d-x团队在线答疑,问问是怎么回事