Post image

Как подружить Cocos2d-x и CLion

Начав заниматься C++ и Cocos2d-x меня долгое время не покидало ощущение жгучего неудобства при написании кода. А все дело в том что я уже несколько лет пользуюсь сверх замечательными и удобными IDE от JetBrains. После них Visual Studio кажется слишком корявой. Даже ReSharper не спасает положение.

Но с выходом CLion все изменилось. Правда для того чтобы запустить Cocos2d-x проект с помощью CLion необходимо немного поколдовать, пританцовывая с бубном.

Поэтому, я подумал что руководство "Как подружить Cocos2d-x и CLion" на русском, кому нибудь окажется полезны.

Установка и настройка MSYS и MinGW

Для начала необходимо установить на машину MSYS.

MSYS (Minimal SYStem) - предоставляет win32-порты окружения легковесной Unix-подобной оболочки

Установщик можно скачать здесь: http://msys2.github.io/

После установки открываем консоль MSYS и настраиваем его:

pacman -Sy
pacman --needed -S bash pacman pacman-mirrors msys2-runtime
close MSYS2 and restart with MINGW64 shell
pacman -Su

Устанавливаем дополнительные пакеты, такие как:

MinGW-w64 (Minimalist GNU for Windows) — компилятор, родной программный порт GNU Compiler Collection (GCC) под Windows, вместе с набором свободно распространяемых библиотек импорта и заголовочных файлов для Windows API. MinGW позволяет разработчикам создавать родные (native) приложения Windows.


GNU Debugger — переносимый отладчик проекта GNU, который работает на многих UNIX-подобных системах и умеет производить отладку многих языков программирования, включая Си, C++, Free Pascal, FreeBASIC, Ada и Фортран.

(можно просто скопировать и вставить в консоль):

pacman -S base-devel \
msys2-devel \
mingw-w64-i686-toolchain \
mingw-w64-x86_64-toolchain \
git \
mingw-w64-x86_64-gcc \
mingw-w64-x86_64-gdb \

Для того чтобы собрать пакет cocos2d-x под MinGW-w64 надо клонировать репозиторий упаковочных скринтов:

git clone https://github.com/Alexpux/MINGW-packages.git

Переходим в папку с cocos2d-x:

cd MINGW-packages/mingw-w64-cocos2dx-git/

Завариваем себе чаю, и начинаем компилировать пакет, это займет прилично времени:

makepkg-mingw -sLf

После удачного завершения компиляции устанавливаем собранный пакет. Имя пакета зависит от его версии, поэтому проще всего воспользоваться табуляцией для его правильного написания:

pacman -U mingw-w64-x86_64-cocos2d-x-git-r[в зависимости от версии]-1-any.pkg.tar.xz

После установки пакета можно закрыть окно MSYS. Оно больше не понадобится.

Создание нового Cocos2d-x проекта

Качаем последний билд Сocоs2d-x Запускаем консоль и переходим в папку c Сocоs2d-x:

cd cocos2d-x
python download-deps.py
setup.py
cocos new [Имя проекта] -p com.your_company.mygame -l cpp -d [Папка проекта]

Настройка CLion

Запускаем CLion и не создавая проект заходи в окно настроек:

Переходим во вкладку Build, Extentions, Deployment. Устанавливаем путь к MinGW в поле Use MinGW Home:

(Use MinGW Home) > С:\[Папка с msys]\mingw64

Например C:\msys64\mingw64

Если CLion автоматически не определить путь к СMake, его надо будет указать явно:

(CMake executable) > Use specified: C:\[Папка с msys]\mingw64\bin\cmake.exe

Например C:\msys64\mingw64\bin\cmake.exe

(!)Для того чтобы MinGW работал правильно из переменных окружения ( PATH ) необходимо убрать все упоминания sh.exe . Например у меня в PATH была строчка от git: C:\Program Files (x86)\Git\bin\sh.ex. Исправить подобное просто - необходимо убрать только sh.exe из пути.

Закрываем окно настроек и импортируем проект созданный cocos2d-x скриптом.

Настройка CMakeLists.txt

Теперь надо отредактировать файл сборки проекта, который находится в корневой папке и называется CMakeLists.txt.

Подключаем дополнительные библиотеки к проекту:

Библиотека Recastnavigation - Инструмента для создания навигационной сетки в играх.


Библиотека Bullet Physics Library - физический движок реального времени. Bullet по популярности использования разработчиками компьютерных игр занимает третье место, уступая лишь движкам nVidia PhysX и Havok.

К сожалению я не понял как нормально их отключить. Единственный способ который я нашел (как и отключение физ. движков), внести изменения в файл CMakeCache.txt, который находится во временной папке сборки:

C:\Users\[Имя юзера]\.CLion12\system\cmake\generated\68719a48\68719a48\Debug\
Вместо 68719a48 у вас будет что-то другое.

Отключить использование этих библиотек.

USE_BULLET:BOOL=OFF
USE_RECAST:BOOL=OFF

На изменения в файле сocos2d/CMakeLists.txt где они как бы подключаются, компилятор не реагирует :(

Но чтобы не заниматься магией рекомендую подключить данные библиотеки. Они не помешают. Для их подключения в проект находим строчку

add_subdirectory(${COCOS2D_ROOT})

После неё добавить подключение этих библиотек:

# External phisics engines libraries
if(WIN32)
  add_subdirectory(${COCOS2D_ROOT}/external/bullet)
  add_subdirectory(${COCOS2D_ROOT}/external/recast)
endif()

Так же необходимо подключить еще одну, уже обязательную, библиотеку.

Библиотека TinyXML-2 - простой, маленький, эффективный XML парсер.

В основном CMakeLists.txt файле находим код:

elseif ( WIN32 )
set(PLATFORM_SPECIFIC_SRC
  proj.win32/main.cpp
)
set(PLATFORM_SPECIFIC_HEADERS
 proj.win32/main.h
 proj.win32/resource.h
)
endif()

И заменяем его на:

elseif ( WIN32 )
set(PLATFORM_SPECIFIC_SRC
  proj.win32/main.cpp
  ${COCOS2D_ROOT}/external/tinyxml2/tinyxml2.cpp
)
set(PLATFORM_SPECIFIC_HEADERS
  proj.win32/main.h
  proj.win32/resource.h
  ${COCOS2D_ROOT}/external/tinyxml2/tinyxml2.h
)

Исправление ошибок компиляции

Уже на данном этапе можно попытаться собрать проект. Но я более чем уверен, что компилятор выдаст ошибки.

Файл cocos2d\cocos\ui\UIEditBox\UIEditBoxImpl-win32.cpp функция CWin32InputBox::DlgProc()

Строчку:

TIMERPROC lpTiTorFunc = [](HWND, UINT, UINT, DWORD) {

Надо заменить на:

TIMERPROC lpTimerFunc = [](HWND, UINT, UINT_PTR, DWORD) {

Файл cocos2d\cocos\platform\win32\CCFileUtils-win32.cpp функция _checkPath()

Строки:

WCHAR *pUtf16ExePath = nullptr;
_get_wpgmptr(&pUtf16ExePath);

Надо заменить на:

WCHAR pUtf16ExePath[CC_MAX_PATH];
HMODULE hModule = GetModuleHandle(NULL);
GetModuleFileName(hModule, pUtf16ExePath, (sizeof(pUtf16ExePath)));

Для доступа к ресурсам надо добавить строчку в метод AppDelegate::applicationDidFinishLaunching() в файле AppDelegate.cpp:

FileUtils::getInstance()->addSearchPath("Resources\\");

Ошибки в дополнительных библиотеках

Если была подключена библиотека Bullet Physics Library в ней так же возникнут некоторые ошибки. Это связано с тем что minGW будет собирать 32 разрядную версию приложения, а в Bullet используются небезопасные uint64_t тип. Для устранения данных ошибок надо заменить все преобразования reinterpret_cast<uint64_t> на которые ругается компилятор на reinterpret_cast<uintptr_t>.

uintptr_t - беззнаковый целочисленным memsize-тип, способен безопасно хранить в себе указатель в независимости от разрядности платформы.

Так же заменить строку

btCollisionObject** eaPtr = (btCollisionObject**)(taskDesc.m_mainMemoryPtr);

На:

btCollisionObject** eaPtr = reinterpret_cast<btCollisionObject**>(taskDesc.m_mainMemoryPtr);

Запускаем в дебаг режиме. Все должно задружить, то бишь, заработать.

Правда придется снова заварить себе чая, так как первая компиляция проекта довольно долгая.

Полезные ссылки: