我正在为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。