繁体   English   中英

Windows SDK中DirectX的C ++链接器问题

[英]C++ linker troubles with DirectX in Windows SDK

我正在为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; 在您的标头中,作为类成员,要求您的项目中具有XMFLOAT2 Device::float2( 0, 0 ); 0,0)的.cpp文件(例如CDevice.cpp XMFLOAT2 Device::float2( 0, 0 ); -或您希望拥有的任何初始值-实际声明该变量。 这使得CDevice::float2成为CDevice::float2的静态成员变量。 您已经声明您的CDevice具有static ID3D11Device* device; ,这又需要一个ID3D11Device* CDevice::device = nullptr;的.cpp文件ID3D11Device* CDevice::device = nullptr; 在它链接。

另外,不要在标题中使用命名空间语句。 它们在.cpp文件中非常DirectX::XMFLOAT2 ,但是在标头中,您应该使用全名,例如: 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工具包 ,真是了DirectX工具包的休息过。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM