0

私は本当にこれを理解していません。

基本的に、他のゲームでそれを行う必要がないように、いくつかの DirectX の処理を​​支援するいくつかのクラスをライブラリとして作成しようとしています。GameBase は私が作ったクラスです。この dll プロジェクトは dll としてコンパイルされ、問題なくコンパイルされます。

これを参照する別のプロジェクトがあり、GameBase を拡張する BlankGame というクラスを作成しました。この実行可能プロジェクトをビルドするたびに、次のリンカ エラーが発生します。

error LNK2019: unresolved external symbol "public: virtual __thiscall GameBase::~GameBase(void)" (??1GameBase@@UAE@XZ) referenced in function "public: virtual __thiscall BlankGame::~BlankGame(void)" (??1BlankGame@@UAE@XZ)

error LNK2001: unresolved external symbol "public: virtual void __thiscall GameBase::UnloadContent(void)" (?UnloadContent@GameBase@@UAEXXZ)

error LNK2001: unresolved external symbol "public: virtual bool __thiscall GameBase::LoadContent(void)" (?LoadContent@GameBase@@UAE_NXZ)

以下に、GameBase.h、BlankGame.cpp、BlankGame.h を定義しました。

Gamebase.h

#include "stdafx.h"
#pragma once

#pragma comment(lib, "dxgi.lib")
#pragma comment(lib, "d3d11.lib")
#pragma comment(lib, "d3dx11.lib")
#pragma comment(lib, "d3dx10.lib")

DLEX class GameBase
{
public:
    virtual ~GameBase() = 0;

    virtual bool LoadContent();
    virtual void UnloadContent();
    bool Initialize(HINSTANCE hInst, HWND winHandle, struct DXInitOptions options);
    void ShutDown();
    void BeginScene(float red, float green, float blue, float alpha);
    void EndScene();
    virtual void Render() = 0;
    virtual void Update() = 0;

    void GetProjectionMatrix(D3DXMATRIX&);
    void GetWorldMatrix(D3DXMATRIX&);
    void GetOrthoMatrix(D3DXMATRIX&);

    void GetVideoCardInfo(char*, int&);

    bool CompileD3DShader(wchar_t* filePath, char* entry, char* shaderModel, ID3DBlob** buffer);

protected:
    ID3D11Device* dev;
    ID3D11DeviceContext* devContext;
    IDXGISwapChain* swapChain;
    ID3D11RenderTargetView* backBufferTarget;
    ID3D11Texture2D* depthStencilBuffer;
    ID3D11DepthStencilState* depthStencilState;
    ID3D11DepthStencilView* depthStencilView;
    ID3D11RasterizerState* rasterState;

    D3DXMATRIX projectionMatrix;
    D3DXMATRIX worldMatrix;
    D3DXMATRIX orthoMatrix;

    bool vsyncEnabled;
    int vidMemory;
    char vidCardDesc[128];
};

ブランクゲーム.h

#pragma once

#include <D3D11.h>
#include <D3Dx11.h>
#include <D3Dx10.h>
#include <D3Dcompiler.h>
#include <DxErr.h>
#include <xnamath.h>

#include <GameBase.h>

class BlankGame : public GameBase
{
public:
    BlankGame();
    ~BlankGame();

    bool LoadContent();
    void UnloadContent();
};

ブランクゲーム.cpp

#include "BlankGame.h"


BlankGame::BlankGame()
{

}

BlankGame::~BlankGame()
{
}

bool BlankGame::LoadContent()
{
    return true;
}

void BlankGame::UnloadContent()
{

}

私は何を間違っていますか?DirectX チュートリアルに従って作成した他のプロジェクトで GameBase を作成した方法は、GameBase が別のライブラリではなく、それを拡張するサブクラスと同じプロジェクトにあるという唯一の違いです。

4

1 に答える 1

0

DLEXが定義されている場所で、ヘッダーにこのようなものを配置する必要があります

#if defined(_WIN32)
#   if defined(MAKE_DLL)
#       if defined(EXPORT_API)
#           define DLEX __declspec(dllexport)
#       else
#           define DLEX __declspec(dllimport)
#       endif
#   else
#       define DLEX 
#   endif
#else
#   define DLEX
#endif

次に、ライブラリをコンパイルするときに、MAKE_DLL と EXPORT_API を設定します。
クライアントで何も変更する必要はありません。
このプリプロセッサ コードは、ライブラリをコンパイルしているか、EXPORT_API を使用してリンクしているかを検出します。定義されていない場合、関数をインポートしますが、DLL を作成するように設定されている場合に限ります (静的ライブラリではなく)。

于 2012-05-28T16:13:20.797 に答える