Как перенести Cocos2dx-wp8 из приложения (.exe) в динамическую библиотеку (.dll)
Я занимаюсь этой проблемой уже почти неделю, и у меня все еще есть более 700 ошибок. Обязательно нужна вся ваша помощь! Благодарю.
Проблема: нужно использовать
Cocos2dx для Windows Phone 8
в моем C++ / DirectX Visual Studio 2012 проекте, который также использует C#/XAML UI.
Дано: Cocos2dx-wp8 как проект приложения.exe, загруженный с http://www.cocos2d-x.org/projects/cocos2d-x/wiki/Download
Решение:
- Откройте мой проект Cs /XAML/DirectX Game1.sln в Visual Studio 2012.
- Щелкните правой кнопкой мыши решение в обозревателе решений. Добавить -> Существующий проект...
- Выбрано: \cocos2dx-0.13.0-wp8-0.8\HelloWorld\cocos2d.vcxproj и открытое нажатие
- Переименуйте проект HelloWorld во что-то другое, например Cocos2dxWp8, и удалите папку HelloWorld Classes и все активы, которые вам не нужны (например, белки и фоновые изображения).
Выберите Свойства -> Свойства конфигурации -> Общие -> Тип конфигурации -> в разделе "Приложение (.exe) измените на" Динамическая библиотека (.dll)"
Добавлены новые пути к Свойствам -> C/C++ -> Дополнительные каталоги включения ->
$ (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\ платформа; вкл; %(AdditionalIncludeDirectories)
- Обновлены пути в Свойствах -> Компоновщик -> Ввод -> Дополнительные зависимости ->
.. \ cocos2dx \ платформа \ THIRD_PARTY \win8_metro\ библиотеки \x86\freetype.lib; ..\cocos2dx\ платформа \ THIRD_PARTY \win8_metro\ библиотеки \x86\zlib.lib; ..\cocos2dx\ платформа \ THIRD_PARTY \win8_metro\ библиотеки \x86\libjpeg.lib; ..\cocos2dx\ платформа \ THIRD_PARTY \win8_metro\ библиотеки \x86\libpng.lib; dxguid.lib;xaudio2.lib;dxgi.lib;uuid.lib;d3d11.lib;%(AdditionalDependencies)
- Обновленные пути в каталогах VC++:
$ (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, так что...
В CCPlatformMacros.h я включил экспорт классов в dll:
#define CC_DLL __declspec (dllexport)
Да, тогда пишется.lib...
715 ошибок, 772 предупреждений
Ошибка 773, ошибка LNK2001: неразрешенный внешний символ "public: virtual __thiscall cocos2d::CCKeypadHandler:: ~ CCKeypadHandler (void)" (?? 1CCKeypadHandler @ cocos2d @cocos2d@UAE@XZ) F:\src\WindowsPhone\GameWp8Dx\GameWp2Dx \ WorldWp8Dx \CCSpriteBatchNode.obj Cocos2dXWp8Framework Ошибка 774 Ошибка LNK2001: неразрешенный внешний символ "public: virtual __thiscall cocos2d::CCKeypadHandler::~CCKeypadHandler(void)" (??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 @andKand (Handler"): CCH2) @@ 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 Windows \GameWp8Dx\GameWp8Dx\Cocos2dxWp8\HelloWorld\CCDrawingPrimitives.obj Cocos2dXWp8Framework Ошибка 1483 ошибка LNK2001: неразрешенный внешний символ "public: virtual void __thiscall cocos2d:: CCTMXMapInfo:: textHandst (textHand) @ cocos2d @ UAEXPAXPBDH @ Z) F: \ SRC \WindowsPhone\GameWp8Dx\GameWp8Dx\Cocos2dxWp8\HelloWorld\cocos2d.obj Cocos2dXWp8Framework ошибка 1484 ошибка LNK2019: неразрешенный внешний символ "общественности: виртуальный __thiscall cocos2d::CCKeypadDispatcher::~CCKeypadDispatcher(аннулируются)" (??1CCKeypadDispatcher@cocos2d@UAE@XZ) упоминается в функции"public: virtual void * __thiscall cocos2d::CCKeypadDispatcher::`деструктор удаления вектора '(unsigned int)" (??_ECCKeypadDispatcher@cocos2d@UAEPAXI@Z): \ SRC \WindowsPhone\GameWp8Dx\GameWp8Dx\Cocos2dxWp8\HelloWorld\CCDirector.obj Cocos2dXWp8Framework Ошибка 1485 Ошибка LNK2001: неразрешенный внешний символ "public: virtual __thiscall cocos2d::CCKeypadDispatcher::~CCKeypadDispatcher(void)" (??1CCKeypadDispatcher@cocos2d@ F: \ UAE XSZ): UAE XSZ \ GameWp8Dx \ Cocos2dxWp8 \ HelloWorld \ CCLayer.obj Cocos2dXWp8Framework Ошибка 1486 Ошибка LNK2001: неразрешенный внешний символ "public: virtual src\WindowsPhone\GameWp8Dx\GameWp8Dx\Cocos2dxWp8\HelloWorld\CCEGLView_win8_metro.obj Cocos2dXWp8Framework Ошибка 1487 LNK1120: 48 неразрешенных внешних файлов
Пути решения / проекта:
F: \ src \ WindowsPhone \ GameWp8Dx \ GameWp8Dx.sln F: \ src \ WindowsPhone \ GameWp8Dx \ GameWp8Dx \ GameWp8Dx \ GameWp8Dx.csproj F: \ src \ WindowsPhone \ GameWp8Dx \ GameWp8Dx.pon Windows XP \ GameWp8Dx \ GameWp8Dx \ Cocos2dxWp8 \ HelloWorld \ cocos2d.vcxproj
Cocos2d Включить файлы:
F: \ src \ WindowsPhone \ GameWp8Dx \ GameWp8Dx \ Cocos2dxWp8 \ cocos2dx \ include F: \ src \ WindowsPhone \ GameWp8Dx \ GameWp8Dx \ Cocos2dxWp8 \ cocos2dx \ platform
Объектные файлы построены здесь:
F: \ SRC \ WindowsPhone \ GameWp8Dx \ GameWp8Dx \ Cocos2dxWp8 \ HelloWorld \ Win32 \ Debug *.obj
.dll /.lib построен здесь:
F: \ SRC \ WindowsPhone \ GameWp8Dx \ GameWp8Dx \ Cocos2dxWp8 \ Win32 \ Debug \ cocos2d
Извините за длинный пост, но я надеюсь, что достаточно подробностей, чтобы этот вопрос возник. Благодарю.
2 ответа
Я создал новый проект динамической библиотеки, затем скопировал файлы. Я собрал.dll и.lib, но не работал для цели сборки процессора ARM (используется для устройств). Кроме того, установка для директора и слоя сцены Cocos2dx, кажется, не работает должным образом с существующим C#/XAML с проектом DirectX, который визуализируется в элемент управления DrawingSurfaceBackgroundGrid. В конце концов, я не использовал Cocos2dx в своей смешанной настройке проекта.
Если у кого-то есть предложения получше, пожалуйста, дайте мне знать. Благодарю.
НА ТЕМУ: Возможно, вы не правильно установили зависимости проекта внутри вашего SLN?
Я заставил Cocos2d частично работать с XAML+D3d Interop, но поскольку вызовы возвращаются и возвращаются из библиотеки XAMLComponent в библиотеку Cocos2d, кажется, что они испортили указатели и память. Прямо сейчас я попытался переместить все исходные файлы Cocos2D в мой проект D3Dcomponent, но что-то ужасно не так, и я получил странное исключение для kernelbase.dll с первым шансом.
ВЫКЛЮЧЕНА ТЕМА: Я также пытался поместить игру, созданную поверх cocos2d-x, в проект взаимодействия XAML+D3D и использовал шаблон, поставляемый с Visual Studio 2012. Однако отображался только нечеткий фон. Я использовал DrawingSurfaceBackgroundGrid и позже узнал, что в Windows Phone 8 есть некоторые проблемы, связанные с Z-порядком. В итоге я заменил его на DrawingSurface.