以前のバージョンのCocos2dxを使ってゲームを作成し、VS 2013でコンパイルしていました.Makeと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;
前方宣言でした。私はQuestionParser.h
ファイルをQCard.cpp
に含めましたが、QCard
の順方向宣言をQCard.h
に使用したので、QCardManager.cpp
ファイルにはQuestion
の実装がなく、リンカーエラーが発生しました。
ここに私の質問があります:VS 2015が期待する動作であるはずです。しかし、なぜその行動が起こっているのですか?同じコードがVS 2013ではエラーなしでコンパイルされますが、VS 2015ではコンパイルされません。私はBreaking Changes in Visual C++ 2015のガイドを読んで、関連するものは何も表示されませんでした。
EDIT 1: 前方宣言がstruct Question
代わりのclass Question
されている必要がありますが判明。私がをQCardManager.cpp
に使用しようとすると、上記のリンカエラーが発生します。しかし、同じディレクトリにある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);
}
あなたが正しいです、 'Question'は' struct'です。前方宣言を 'class Question;'から 'struct Question'に変更した後、問題は解消されます。しかし、それは私のために別の質問を提起します。その変更を行う前に、エラーを発生させた同じコードが別のクラスでエラーを発生させませんでした。私は私の質問に編集の説明を追加しました。ありがとう。 – Furkanzmc