我使用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.經過幾個小時的調試,我發現原因。
這裏是QCard
粗糙decleration:
#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
文件,該文件也被正確地添加到項目中。 所以問題是class Question;
轉發聲明。我在QCard.cpp
中包含了QuestionParser.h
文件,但由於我在QCard.h
中使用了QCard
的正向聲明,因此QCardManager.cpp
文件沒有執行Question
,因此鏈接器錯誤。
以下是我的問題:我意識到2015年的應該是預期的行爲。但爲什麼會發生這種行爲?相同的代碼在VS 2013上編譯時沒有錯誤,但在VS 2015上沒有錯誤。我閱讀了Breaking Changes in Visual C++ 2015指南,並且看不到任何相關的內容。
編輯1: 原來向前聲明應該已經struct Question
而不是class Question
。當我嘗試在QCardManager.cpp
中使用QCard::create
時,我收到前面提到的鏈接器錯誤。但不在TimerHUD.cpp
,這是在同一目錄中。我會發布他們的總結內容。請記住,我保留QCard
的聲明與此編輯相同。
問題結構,這是在QuestionParser.h
:
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);
}
QCardManager
引發鏈接器錯誤。但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);
}
你說得對,'問題'是'struct'。將前面的聲明從'class Question'改爲'struct Question'後,問題就消失了。但是這對我提出了另一個問題,在進行更改之前,提出錯誤的相同代碼在另一個類中沒有引起錯誤。我在編輯中爲我的問題添加了更多解釋。謝謝。 – Furkanzmc