我正在为Windows 7和Windows 8编写游戏。我一直在使用VS2012。因此,基本上,我正努力使自己了解Windows SDK。 d3dX10math已被替换,我已经同意了,并在必要时添加了DirectXMath.h。

链接器经常会出现问题。它没有链接到必要的库。它们就在外部依赖项中(我假设旧的d3dx10math.lib已被这些.inl文件取代了吗?)。我找不到等效的.lib文件,所以这就是我的假设。

它只是不想实际链接到它们。我在线上搜索过高低,似乎没有人问过这个问题。我觉得我错过了什么吗?

#ifndef _CDEVICE_H_
#define _CDEVICE_H_

//#include <vector>

#pragma once
//#pragma comment(lib, "dxgi.lib")
//#pragma comment(lib, "d3d11.lib")

#include <dxgi.h>
#include <d3d11.h>
#include <DirectXMath.h>

using namespace DirectX;

static class cDevice
{
public:
    cDevice();
    cDevice(const cDevice&);
    ~cDevice();
private:
    static ID3D11Device* device;
    static XMFLOAT2 float2;
} device;

#endif


然后我得到这个链接器错误

1>cDevice.obj : error LNK2001: unresolved external symbol "private: static struct DirectX::XMFLOAT2 cDevice::float2" (?float2@cDevice@@0UXMFLOAT2@DirectX@@A)

最佳答案

作为类成员的标题中的static XMFLOAT2 float2;要求您的项目中有一个.cpp文件(例如CDevice.cpp),该文件中具有XMFLOAT2 Device::float2( 0, 0 );-或期望的任何初始值-在其中实际声明变量。这使得CDevice::float2成为该类的静态成员变量。您已经声明您的CDevice具有static ID3D11Device* device;,这又需要一个带有ID3D11Device* CDevice::device = nullptr;的.cpp文件进行链接。

另外,不要在标题中使用命名空间语句。它们在.cpp文件中非常有用,但是在标头中,您应该使用全名,例如:DirectX::XMFLOAT2

像这样的.h:

static class cDevice
{
public:
    cDevice();
    cDevice(const cDevice&);
    ~cDevice();
private:
    static ID3D11Device* device;
    static DirectX::XMFLOAT2 float2;
} device;


将需要一个.cpp文件,如下所示:

#include "CDevice.h" using namespace DirectX;
using namespace DirectX;

ID3D11Device* CDevice::device = nullptr;
XMFLOAT2 CDevice::float2(0, 0);


而且,如果您将.h包含在多个.cpp文件中,则您会发现每个.h文件中都有它自己不相关的CDevice副本。

我不知道为什么要这样做,因为这对设计没有意义(您应该在类CDevice中使用非静态变量,或者应该使用namespace CDevice代替,因为您实际上没有使用对象封装,或者可能没有使用单例)。您可能应该阅读有关C ++的入门知识,以获取这些内容的基础知识,因为它与DirectX完全无关,并且您对使用(公认的重载)关键字static感到非常困惑。

我强烈建议您看看在SimpleMath中使用DirectXMath的DirectX Tool Kit包装器,以及其余的DirectX Tool Kit。

我还建议您迁移到VS 2013 Community Edition而不是VS 2012(Windows桌面Express?),并使用Direct3D Win32 Game模板来支持Windows 7。

10-06 01:56