cocos2d::extension::ScrollView::create() вызывает неразрешенный внешний символ (VS2012)

У меня возникли трудности с добавлением прокрутки в меню с помощью cocos2d-x. Я использую cocos2d::extension::ScrollView::create() для создания прокрутки, но при компиляции получаю ошибку:

Ошибка 6 ошибка LNK2019: неразрешенный внешний символ "public: static class cocos2d::extension::ScrollView * __cdecl cocos2d::extension::ScrollView::create(class cocos2d::Size,class cocos2d::Node *)" (?create @ScrollView@extension@cocos2d@@SAPAV123@VSize@3@PAVNode@3@@Z), на который ссылается функция "public: virtual bool __thiscall ScrollMenuScene::init(void)" (?init@ScrollMenuScene@@UAE_NXZ) C:\ Cocos\cocos2d-x-3.0\~\MyCompany\MyGame\proj.win32\ScrollMenuScene.obj MyGame

Ниже приведен фрагмент кода файлов h и cpp, вплоть до минимума медведя, но включающий весь необходимый код, который вызывает ошибку сборки.

Основная строка, вызывающая ошибку:

_scrollView = cocos2d::extension::ScrollView::create(_scrollContainer->getContentSize(), _scrollContainer);

Если я не создам экземпляр указателя _scrollView, он не выдаст ошибку, поэтому это происходит, когда я вызываю ScrollView::create

Любая помощь будет оценена. Спасибо.

*Обратите внимание, что в приведенном ниже коде я добавил весь файл, чтобы показать включения, определения и реализации, поскольку именно здесь я обычно нахожу неразрешенные ошибки.

.h файл

#ifndef SCROLL_MENU_SCENE_H
#define SCROLL_MENU_SCENE_H

#include "cocos2d.h"
#include "cocos-ext.h"

class ScrollMenuScene : public cocos2d::Layer
{
private:
   cocos2d::Node* _scrollContainer;
   cocos2d::extension::ScrollView *_scrollView;
   cocos2d::Menu* _menu;

public:
   // there's no 'id' in cpp, so we recommend returning the class instance pointer
   static cocos2d::Scene* createScene();

   // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone
   virtual bool init();

   ~ScrollMenuScene(void);

   // implement the "static create()" method manually
   CREATE_FUNC(ScrollMenuScene);

   //Menu callback.
   void Menu_Handler(cocos2d::Ref* sender);
};

#endif //SCROLL_MENU_SCENE_H

.cpp-файл

#include "ScrollMenuScene.h"

cocos2d::Scene* ScrollMenuScene::createScene()
{
   // 'scene' is an autorelease object
   auto scene = cocos2d::Scene::create();

   // 'layer' is an autorelease object
   auto layer = ScrollMenuScene::create();

   // add layer as a child to scene
   scene->addChild(layer);

   // return the scene
   return scene;
}

// on "init" you need to initialize your instance
bool ScrollMenuScene::init()
{
   //Call base first.
   if (!Layer::init())
   {
      return false;
   }

   cocos2d::Point worldCenter = cocos2d::Point(this->getContentSize() / 2);

   _scrollContainer = cocos2d::Node::create();
   _scrollContainer->setPosition(worldCenter);
   _scrollContainer->setContentSize(this->getContentSize() / 2); //half the size of the layer.

   _scrollView = cocos2d::extension::ScrollView::create(_scrollContainer->getContentSize(), _scrollContainer);
   _scrollView->setPosition(worldCenter);
   _scrollView->setDirection(cocos2d::extension::ScrollView::Direction::VERTICAL);

   //Add Menu.
   cocos2d::MenuItemImage *item0 = cocos2d::MenuItemImage::create("Images/PlayMenu/PlayMenuTile0.png",
      "Images/PlayMenu/PlayMenuTile0.png", this, menu_selector(ScrollMenuScene::Menu_Handler));

   _menu = cocos2d::Menu::create();
   _menu->addChild(item0);

   _menu->alignItemsVerticallyWithPadding(20);
   _menu->setPosition(worldCenter);
   this->addChild(_menu);

   //add scroll view to layer.
   this->addChild(_scrollView);

   return true;
}

void ScrollMenuScene::Menu_Handler(cocos2d::Ref* sender)
{
   //<Menu item tap implementation>
}

ScrollMenuScene::~ScrollMenuScene()
{
   _scrollContainer->release();
}

person TFK    schedule 25.08.2014    source источник
comment
добавить проект расширений и библиотеку в компоновщик в ваш проект   -  person Vikas Patidar    schedule 26.08.2014
comment
@ВикасПатидар. Я пошел в Linker/General/Additional Library Directory, добавил $(EngineRoot)extensions. При компиляции получаю те же ошибки. Затем добавил проект libExtensions.vcxproj в решение и получил 21 ошибку «невозможно открыть включаемый файл:« поток »Нет такого файла или каталога» - исходит из CCConsole.h @ libExtensions. + все еще получаю оригинальные 2 ошибки. Что также странно, так это то, что я могу получить доступ к частям ScrollView без необходимости связывать проект. Например, я могу запустить cocos2d::extension::ScrollView::Direction без ошибок, и это перечисление находится внутри того же файла ScrollView. Есть идеи?   -  person TFK    schedule 27.08.2014
comment
есть проект шаблона с именем cpp-empty-test в каталоге tests. Можешь попробовать. Туда включены все расширения вместе с путями поиска заголовков и библиотеками компоновщика.   -  person Vikas Patidar    schedule 27.08.2014
comment
@ВикасПатидар. Спасибо. Я попробую в ближайшие пару дней и посмотрю, как это пойдет. Надеюсь, это также решит мою проблему с Android — он не будет компилироваться, вызывая у меня подобные проблемы.   -  person TFK    schedule 27.08.2014
comment
@ВикасПатидар. Использование тестового проекта тоже не сработало, и я получил те же сообщения об ошибках. Но я нашел исправление для него. Я опубликую это под ответом. Еще раз спасибо за то, что указали мне правильное направление.   -  person TFK    schedule 29.08.2014


Ответы (1)


Проблема действительно была связана с тем, что предложил @VikasPatidar. Добавление проекта libExtensions в мое решение решило часть проблемы.

Следующей возникшей проблемой была серия отсутствующих ссылок на включение файлов Mutex и Thread. Эти файлы являются частью C++ и включены в VS2012. Проблема заключалась в том, что они не были частью Внешних зависимостей в проекте libExtensions и не могли понять, как их добавить.

Чтобы решить эту проблему, я открыл файл cocos2d-win32.vc2012.sln в папке моей игры/cocos2d/build. Когда я это сделал, VS обнаружил, что он не синхронизирован, и попросил меня выполнить синхронизацию. После синхронизации все внешние зависимости были сопоставлены правильно. Обратите внимание, что я сделал это в папке своей игры, а не в папке Cocos/cocos2d-x-3.0.

Я лично думаю, что это было вызвано тем, что первоначальная загрузка, которую я получил от кокосов, была несовместима с vs2012, а вместо этого с vs2010, потому что проект libExtensions загружался с флагом vs2010.

Обобщить,

  1. Добавьте проект cocos2d/extensions/proj.win32/libExtensions.vcxproj в существующее решение.
  2. Убедитесь, что он совместим с VS2012. Чтобы синхронизировать его, просто откройте файл build/cocos2d-win32.vc2012.sln в своей игре и следуйте инструкциям по синхронизации.

Обратите внимание, что это относится к VS. Eclipse и Android вместе могут быть еще одной проблемой.

person TFK    schedule 29.08.2014