이전 버전의 Cocos2dx를 사용하여 게임을 작성하고 VS 2013으로 컴파일했습니다. CMake 및 Qt Creator를 두 컴파일러 버전. Cocos2dx v3.12가 나왔을 때, 나는 내 게임에 해당 버전에 lib 디렉토리를 업그레이드하기로 결정 VS 2015를 사용하기 시작 그럼 난이 오류 받기 시작 :LNK2001 VS 2013 (MSVC 18)에 있지만 VS 2015 (MSVC 19)에 없습니다.
QCardManager.cpp.obj:-1: error: LNK2001: unresolved external symbol "public: static class QCard * __cdecl QCard::create(enum PLAYER,struct Question const *,enum CARD_TYPE,int const &)" ([email protected]@@[email protected]@@[email protected]@[email protected]@[email protected])
를 내가 때 나는 오류가 발생하지 않았다 VS 2013을 사용했다. 두 시간의 디버깅 후 나는 그 이유를 발견했다.
#include "2d/CCSprite.h"
#include "CommonVariables.h"
class RandomPostureSprite;
class Question;
namespace cocos2d
{
class Label;
}
enum class CARD_TYPE {
QUESTION,
OPTION
};
class QCard : public cocos2d::Sprite
{
public:
static QCard *create(PLAYER player, const Question *question, CARD_TYPE type, const int &index);
}
을 그리고 QCard.cpp
파일에 그 함수의 적절한 구현을 가지고 해당 파일은 제대로 프로젝트에 추가되었습니다
여기 QCard
의 거친 decleration입니다. 문제는 class Question;
전달 선언이었습니다. 나는 파일을 QCard.cpp
에 포함 시켰습니다. QCard
에 대한 전방 선언을 QCard.h
에 사용 했으므로 QCardManager.cpp
파일에 Question
에 대한 구현이 없으므로 링커 오류가 발생했습니다.
여기 내 질문이 있습니다. VS 2015는 예상되는 동작이어야한다는 것을 알고 있습니다. 그러나 왜 그런 행동이 일어나고 있습니까? 동일한 코드가 VS 2013에서는 오류없이 컴파일되지만 VS 2015에서는 컴파일되지 않습니다. Breaking Changes in Visual C++ 2015 가이드를 읽고 관련된 모든 것을 볼 수 없었습니다.
편집 1 : 는 전방 선언이 struct Question
대신 class Question
했어야 밝혀졌습니다. 을 QCardManager.cpp
에 넣으려고하면 위의 링커 오류가 발생합니다. 그러나 동일한 디렉토리에있는 TimerHUD.cpp
에는 없습니다. 나는 그 둘의 요약 내용을 게시 할 것이다. QCard
의 선언은이 편집과 동일하게 유지됩니다. QuestionParser.h
에
[질문 구조체 :
struct Question {
Question()
: type()
, source()
, alias()
, color(0, 0, 0)
{}
};
QCardManager.h
// Cocos2dx
#include "math/Vec2.h"
#include "math/CCGeometry.h"
// Utilities
#include "CommonVariables.h"
// Local
#include "GameDefinitions.h"
#include "QuestionParser.h"// This has the Question struct
// Forward declerations
class QCard;
namespace cocos2d
{
class Layer;
class Sprite;
}
class QCardManager
{
}
QCardManager.cpp
#include "QCardManager.h"
// Local
#include "QCard.h"
#include "RandomPostureSprite.h"
// Utilities
#include "GameManager.h"
#include "GameSettings.h"
#include "CocosUtils.h"
// Cocos2dx
#include "cocos2d.h"
using namespace cocos2d;
QCardManager::QCardManager(PLAYER player, Layer &parent)
{
// This line gives the linker error
QCard::create(PLAYER::PLAYER_ONE, nullptr, CARD_TYPE::QUESTION, 1);
}
링커 오류가 발생합니다. 그러나 TimerHUD
하지 않습니다. 지금 내용을 공유하고 있습니다.
TimerHUD.h
// Cocos2dx
#include "2d/CCNode.h"
namespace cocos2d
{
class Sprite;
class Label;
}
class TimerHUD : public cocos2d::Node
{
}
TimerHUD.cpp
// Cocos2dx
#include "cocos2d.h"
#include "SimpleAudioEngine.h"
// Local
#include "GameDefinitions.h"
// Utilities
#include "GameManager.h"
#include "GameSettings.h"
#include "CocosUtils.h"
#include "QCard.h"
using namespace cocos2d;
TimerHUD::TimerHUD()
{
// This does not raise the linker error
QCard::create(PLAYER::PLAYER_ONE, nullptr, CARD_TYPE::QUESTION, 1);
}
맞아요,'질문'은'구조체'입니다. forward 선언문을'class Question;'에서'struct Question'으로 변경 한 후에 문제가 사라집니다. 그러나 그것은 저에게 또 다른 질문을 던집니다. 변경하기 전에 오류를 발생시킨 동일한 코드가 다른 클래스에서 오류를 발생시키지 않았습니다. 내 질문에 대한 편집에 더 많은 설명을 추가했습니다. 감사. – Furkanzmc