如何将Cocos2dx-wp8从Application(.exe)移植到动态库(.dll)

时间:2012-11-15 02:59:15

标签: visual-c++ dll cocos2d-x dllexport windows-phone-8

我已经解决了这个问题差不多一个星期了,我还有700多个错误。绝对需要你的帮助!感谢。

问题:需要使用

  

Windows Phone 8的Cocos2dx

在我的 C ++ / DirectX Visual Studio 2012项目中,该项目也使用C#/ XAML UI。

鉴于:Cocos2dx-wp8作为从http://www.cocos2d-x.org/projects/cocos2d-x/wiki/Download下载的Application .exe项目

解决方案

  1. 在Visual Studio 2012中打开我的C#/ XAML / DirectX Game1解决方案.sln项目。
  2. 右键单击解决方案资源管理器中的解决方案添加 - >现有项目......
  3. 已选择:\ cocos2dx-0.13.0-wp8-0.8 \ HelloWorld \ cocos2d.vcxproj并点击打开
  4. 将HelloWorld项目重命名为" Cocos2dxWp8"并删除HelloWorld Classes文件夹和您不想要的所有资产(如松鼠和背景图片)
  5. 点击属性 - >配置属性 - >一般 - >配置类型 - >来自"应用程序(.exe)更改为"动态库(.dll)"

  6. 添加了属性的新路径 - > C / C ++ - >其他包含目录 - >

  7.   

    $(PROJECTDIR); $(IntermediateOutputPath); .. \ cocos2dx \包括;   .. \ cocos2dx; .. \ cocos2dx \平台\ THIRD_PARTY \ win8_metro \ libpng的;   .. \ cocos2dx \平台\ THIRD_PARTY \ win8_metro \ zlib的;   .. \ cocos2dx \平台\ THIRD_PARTY \ win8_metro; .... \ Cocos2dxWp8;   .. \ cocos2dx \平台\ win8_metro;   .. \ cocos2dx \平台\ THIRD_PARTY \ win8_metro \ FreeType的;   .. \ cocos2dx \平台\ THIRD_PARTY \ win8_metro \的libjpeg;   .. \ CocosDenshion \包括; .. \ cocos2dx \平台; INC;   %(AdditionalIncludeDirectories)

    1. 更新了属性中的路径 - >链接器 - >输入 - >其他依赖关系 - >
    2.   

      .. \ cocos2dx \平台\ THIRD_PARTY \ win8_metro \库\ 86 \ freetype.lib;   .. \ cocos2dx \平台\ THIRD_PARTY \ win8_metro \库\ 86 \ zlib.lib;   .. \ cocos2dx \平台\ THIRD_PARTY \ win8_metro \库\ 86 \ libjpeg.lib;   .. \ cocos2dx \平台\ THIRD_PARTY \ win8_metro \库\ 86 \ libpng.lib;   DXGUID.LIB; xaudio2.lib; dxgi.lib; UUID.LIB; d3d11.lib;%(AdditionalDependencies)

      1. VC ++目录中的更新路径:
      2.   

        $(SolutionDir)GameWp8Dx \ Cocos2dxWp8 \ cocos2dx \平台\ THIRD_PARTY \ win8_metro \ freetype的;   $(SolutionDir); $(PROJECTDIR)公司;   $(SolutionDir)GameWp8Dx \ Cocos2dxWp8 \ CocosDenshion \包括:   $(SolutionDir)GameWp8Dx \ Cocos2dxWp8 \ cocos2dx \平台\ THIRD_PARTY \ win8_metro \ zlib的;   $(SolutionDir)GameWp8Dx \ Cocos2dxWp8 \ cocos2dx \平台\ THIRD_PARTY \ win8_metro \库;   $(SolutionDir)GameWp8Dx \ Cocos2dxWp8 \ cocos2dx \平台\ THIRD_PARTY \ win8_metro \ libpng的;   $(SolutionDir)GameWp8Dx \ Cocos2dxWp8 \ cocos2dx \平台\ THIRD_PARTY \ win8_metro \的libjpeg;   $(SolutionDir)GameWp8Dx \ Cocos2dxWp8 \ cocos2dx \平台\ THIRD_PARTY \ win8_metro \ libxml2的;   $(SolutionDir)GameWp8Dx \ Cocos2dxWp8 \ cocos2dx \平台\ THIRD_PARTY \ win8_metro \;   $(SolutionDir)GameWp8Dx \ Cocos2dxWp8 \ cocos2dx \平台\ win8_metro;   $(SolutionDir)GameWp8Dx \ Cocos2dxWp8 \ cocos2dx \平台;   $(SolutionDir)GameWp8Dx \ Cocos2dxWp8 \ cocos2dx \包括:   $(SolutionDir)GameWp8Dx \ Cocos2dxWp8 \ cocos2dx; $(INCLUDEPATH)

        从这里开始,它构建成功! 它输出.dll文件,但没有.lib文件,所以......

        1. 在CCPlatformMacros.h中,我启用了将类导出到dll:

          #define CC_DLL __declspec(dllexport)

        2. 是的,.lib正在写给那时......

          715错误,772警告

            

          错误773错误LNK2001:未解析的外部符号" public:virtual   __thiscall cocos2d :: CCKeypadHandler ::〜CCKeypadHandler(void)" (?? 1CCKeypadHandler @ @的cocos2d UAE @ XZ)   F:\ SRC \ WindowsPhone的\ GameWp8Dx \ GameWp8Dx \ Cocos2dxWp8 \ HelloWorld的\ CCSpriteBatchNode.obj   Cocos2dXWp8Framework错误774错误LNK2001:未解析的外部   符号" public:virtual __thiscall   的cocos2d :: CCKeypadHandler ::〜CCKeypadHandler(无效)"   (?? 1CCKeypadHandler @ @的cocos2d UAE @ XZ)

          我已经包含了定义CCKeyHandler类的头文件(在CCKeypadDelegate.h中),而CCSpriteBatchNode.h也在同一个include文件夹中。

          类签名如下所示:

          class CC_DLL CCKeypadHandler : public CCObject
          class CC_DLL CCSpriteBatchNode : public CCNode, public CCTextureProtocol
          

          错误继续原样......

            

          F:\ SRC \的WindowsPhone \ GameWp8Dx \ GameWp8Dx \ Cocos2dxWp8 \的HelloWorld \ cocos2dorig.obj   Cocos2dXWp8Framework错误775错误LNK2001:未解析的外部   符号" public:virtual __thiscall   的cocos2d :: CCKeypadHandler ::〜CCKeypadHandler(无效)"   (?? 1CCKeypadHandler @ @@的cocos2d UAE @ XZ)   F:\ SRC \ WindowsPhone的\ GameWp8Dx \ GameWp8Dx \ Cocos2dxWp8 \ HelloWorld的\ CCImage_win8_metro.obj   Cocos2dXWp8Framework

               

          ...

               

          错误1482错误LNK2001:未解析的外部符号" public:virtual   void __thiscall cocos2d :: CCTMXMapInfo :: textHandler(void *,char const   *,INT)" (?textHandler @ CCTMXMapInfo @ cocos2d @ UAEXPAXPBDH @ Z)F:\ src \ WindowsPhone \ GameWp8Dx \ GameWp8Dx \ Cocos2dxWp8 \ HelloWorld \ CCDrawingPrimitives.obj   Cocos2dXWp8Framework错误1483错误LNK2001:未解析的外部   符号" public:virtual void __thiscall   cocos2d :: CCTMXMapInfo :: textHandler(void *,char const *,int)"   (?textHandler @ CCTMXMapInfo @ cocos2d的@ UAEXPAXPBDH @ Z)   F:\ SRC \ WindowsPhone的\ GameWp8Dx \ GameWp8Dx \ Cocos2dxWp8 \ HelloWorld的\ cocos2d.obj   Cocos2dXWp8Framework错误1484错误LNK2019:未解析的外部   符号" public:virtual __thiscall   的cocos2d :: CCKeypadDispatcher ::〜CCKeypadDispatcher(无效)"   (?? 1CCKeypadDispatcher @ cocos2d @ UAE @XZ)在函数" public中引用:   virtual void * __thiscall cocos2d :: CCKeypadDispatcher ::`vector   删除析构函数'(unsigned int)"   (?? _ ECCKeypadDispatcher @ @的cocos2d @ UAEPAXI Z)   F:\ SRC \ WindowsPhone的\ GameWp8Dx \ GameWp8Dx \ Cocos2dxWp8 \ HelloWorld的\ CCDirector.obj   Cocos2dXWp8Framework错误1485错误LNK2001:未解析的外部   符号" public:virtual __thiscall   的cocos2d :: CCKeypadDispatcher ::〜CCKeypadDispatcher(无效)"   (?? 1CCKeypadDispatcher @ @的cocos2d UAE @ XZ)   F:\ SRC \ WindowsPhone的\ GameWp8Dx \ GameWp8Dx \ Cocos2dxWp8 \ HelloWorld的\ CCLayer.obj   Cocos2dXWp8Framework错误1486错误LNK2001:未解析的外部   符号" public:virtual __thiscall   的cocos2d :: CCKeypadDispatcher ::〜CCKeypadDispatcher(无效)"   (?? 1CCKeypadDispatcher @ @的cocos2d UAE @ XZ)   F:\ SRC \ WindowsPhone的\ GameWp8Dx \ GameWp8Dx \ Cocos2dxWp8 \ HelloWorld的\ CCEGLView_win8_metro.obj   Cocos2dXWp8Framework错误1487错误LNK1120:48个未解析的外部   F:\ SRC \ WindowsPhone的\ GameWp8Dx \ GameWp8Dx \ Cocos2dxWp8 \ WIN32 \调试\ cocos2d的\ Cocos2dXWp8Framework.dll   Cocos2dXWp8Framework

          解决方案/项目路径:

          F:\ SRC \的WindowsPhone \ GameWp8Dx \ GameWp8Dx.sln F:\ SRC \ WindowsPhone的\ GameWp8Dx \ GameWp8Dx \ GameWp8Dx \ GameWp8Dx.csproj F:\ SRC \ WindowsPhone的\ GameWp8Dx \ GameWp8Dx \ GameWp8DxComponent \ GameWp8DxComponent.vcxproj F:\ SRC \的WindowsPhone \ GameWp8Dx \ GameWp8Dx \ Cocos2dxWp8 \的HelloWorld \ cocos2d.vcxproj

          Cocos2d包含文件:

          F:\ SRC \的WindowsPhone \ GameWp8Dx \ GameWp8Dx \ Cocos2dxWp8 \ cocos2dx \包括 F:\ SRC \的WindowsPhone \ GameWp8Dx \ GameWp8Dx \ Cocos2dxWp8 \ cocos2dx \平台

          此处构建的对象文件:

          F:\ SRC \的WindowsPhone \ GameWp8Dx \ GameWp8Dx \ Cocos2dxWp8 \的HelloWorld \的Win32 \调试* .OBJ

          .dll / .lib在此处构建:

          F:\ SRC \的WindowsPhone \ GameWp8Dx \ GameWp8Dx \ Cocos2dxWp8 \的Win32 \调试\ cocos2d的

          很抱歉这篇长篇文章,但我希望有足够的细节来解决这个问题。感谢。

2 个答案:

答案 0 :(得分:1)

我创建了一个新的动态库项目,然后复制了文件。我建立了.dll和.lib,但是没有用于ARM CPU构建目标(用于设备)。此外,Cocos2dx控制器和场景图层的设置似乎不适用于现有的带有DirectX项目的C#/ XAML渲染到DrawingSurfaceBackgroundGrid控件上。所以最后,我并没有在我的混合项目设置中使用Cocos2dx。

如果有其他人得到更好的建议,请告诉我。感谢。

答案 1 :(得分:0)

ON主题: 也许您没有在SLN中正确设置项目依赖项?

我让Cocos2d部分使用XAML + D3d Interop,但由于调用从XAMLComponent DLL返回并转发到Cocos2d DLL,它似乎搞乱了指针和内存。 现在我试图将所有Cocos2D源文件移动到我的D3Dcomponent项目中,但是有些东西非常错误,我得到了一个奇怪的kernelbase.dll第一次机会异常。

OFF主题: 我还尝试在XAML + D3D Interop项目上完成cocos2d-x上的游戏,并使用Visual Studio 2012附带的模板。但是,只显示了一个脏污的背景。我正在使用DrawingSurfaceBackgroundGrid,后来发现在Windows Phone 8上,它有一些与Z-order相关的问题。我最终用DrawingSurface替换它了。