Ошибки LNK2005 при использовании Direct3D9

В данный момент я пытаюсь настроить базовое приложение и хочу использовать Direct3D9 в качестве API для рисования примитивных фигур. Например, я хочу создать круг, который будет нарисован объектом круга и треугольником в объекте треугольника и т. Д.

Моя проблема в том, что я получаю ошибки LNK2005, где я не ожидаю их увидеть. Это или я упустил что-то очень очевидное, потому что раньше я использовал этот метод настройки Direct3D9 без проблем.

Вот фактическое сообщение об ошибке, которое я получаю от компилятора (VS 2010)

1>RigidBody.obj : error LNK2005: "struct IDirect3DDevice9 * d3dDevice" (?d3dDevice@@3PAUIDirect3DDevice9@@A) already defined in Main.obj
1>RigidBody.obj : error LNK2005: "struct IDirect3D9 * d3d" (?d3d@@3PAUIDirect3D9@@A) already defined in Main.obj
1>H:\Documents\My Programs\2DPhysEngine\Debug\2DPhysEngine.exe : fatal error LNK1169: one or more multiply defined symbols found

В настоящее время у меня есть два класса (RigidBody и Circle), хотя в настоящее время используется только RigidBody.

Headers.h

#ifndef HEADERS_H
#define HEADERS_H

#include <string>
#include <vector>
#include <windows.h>
#include <windowsx.h>
#include <vector>
#include <d3d9.h>
#include <d3dx9.h>

#pragma comment (lib, "d3d9.lib")
#pragma comment (lib, "d3dx9.lib")

#define SCREEN_WIDTH  1920
#define SCREEN_HEIGHT 1080

LPDIRECT3D9 d3d;
LPDIRECT3DDEVICE9 d3dDevice;

#endif

main.cpp

#include "Headers.h"#include "RigidBody.h"
void initDirectX(HWND hWnd);       // Initializes Direct3D Graphics
void render();                     // Render graphics
void cleanUp();                    // Cleans everything up and releases memory
void gameSetUp();

LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
HWND hWnd;
WNDCLASSEX window;
ZeroMemory(&window, sizeof(WNDCLASSEX));
window.cbSize = sizeof(WNDCLASSEX);
window.style = CS_HREDRAW | CS_VREDRAW;
window.lpfnWndProc = WindowProc;procedure
window.hInstance = hInstance;
window.hCursor = LoadCursor(NULL, IDC_ARROW);
window.lpszClassName = "Window";
RegisterClassEx(&window);

hWnd = CreateWindowEx(NULL,
"Window",
"Space Game",
WS_EX_TOPMOST | WS_POPUP,
0, 0,
SCREEN_WIDTH, SCREEN_HEIGHT,
NULL,
NULL,
hInstance,
NULL);

ShowWindow(hWnd, nCmdShow);
initDirectX(hWnd);
MSG msg = {0};
gameSetUp();

/************************************** Main game loop *************************************************/

while(TRUE)
{
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
if(msg.message == WM_QUIT)
break;
}
else
{
render();
}
}

/*******************************************************************************************************/

cleanUp();
return msg.wParam;
}

LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_DESTROY:
{
PostQuitMessage(0);
return 0;
}
break;
}
return DefWindowProc (hWnd,
message,
wParam,
lParam);
}

void initDirectX(HWND hWnd)
{
d3d = Direct3DCreate9(D3D_SDK_VERSION);
D3DPRESENT_PARAMETERS d3dParameters;
ZeroMemory(&d3dParameters, sizeof(d3dParameters));
d3dParameters.Windowed = FALSE;
d3dParameters.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dParameters.hDeviceWindow = hWnd;
d3dParameters.BackBufferFormat = D3DFMT_X8R8G8B8;
d3dParameters.BackBufferWidth = SCREEN_WIDTH;
d3dParameters.BackBufferHeight = SCREEN_HEIGHT;

d3d->CreateDevice(D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dParameters,
&d3dDevice);
}

void render()
{
d3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(10, 0, 32), 1.0f, 0);
d3dDevice->BeginScene();
d3dDevice->EndScene();
d3dDevice->Present(NULL, NULL, NULL, NULL);
}

void cleanUp()
{
d3dDevice->Release();
d3d->Release();
}

void gameSetUp()
{
}

RigidBody.h

#include "Headers.h"
class RigidBody
{

protected:

float velocity[1];
float position[1];
float mass;

public:

virtual void initPrimitiveGraphics(); // Not implemented yet
virtual void drawPrimitiveObject(); // Not implemented yet

};

Circle.h

#include "RigidBody.h"
class Circle : public RigidBody
{

private:

float radius;

public:

Circle(float objectPosition[1], float objectMass, float objectRadius);

};

Класс Circle и RigidBody также имеют свой собственный файл .cpp, но в этих файлах-заполнителях пока нет метода (или ЛЮБОГО кода).

Так кто-нибудь может понять, почему я могу получить эту ошибку? Я надеюсь, что он будет простым, но я не уверен, так как я настроил Direct3D 9 таким образом, прежде чем у меня не возникнет проблем.

То, что я имею в виду, когда говорю, что настроил таким образом раньше, это то, что я поместил заголовки и указатели Direct3D9 на LPDIRECT3DDEVICE9 а также LPDIRECT3D9 в глобальном заголовочном файле и просто окружили его, используя include guard. Это сработало для моего последнего проекта, и я сравнил два без очевидной разницы.

Я возился с идентификаторами защиты, думая, что он может быть недействительным или используется где-то еще, и используя самый уникальный идентификатор защиты, о котором я только мог подумать, и представил мне ту же ошибку.

Когда я положил:

LPDIRECT3D9 d3d;
LPDIRECT3DDEVICE9 d3dDevice;

в файле Main.cpp и извлеките его из файла Headers.h, проект компилируется нормально. Однако я не хочу этого, поскольку я хочу получить доступ LPDIRECT3DDEVICE9 изнутри каждого объекта, так как именно здесь я собираюсь настроить примитивные формы.

0

Решение

Это потому, что вы объявляете глобальный объект в Headers.h, Объект Globals не может быть объявлен более одного раза. (каждый раз, когда вы включаете заголовок, они будут объявлены …)

ты должен измениться

LPDIRECT3D9 d3d;
LPDIRECT3DDEVICE9 d3dDevice;

от

extern LPDIRECT3D9 d3d;
extern LPDIRECT3DDEVICE9 d3dDevice;

в вас Headers.h и поместите объявление объектов в Main.cpp, например:

// main.cpp
LPDIRECT3D9 d3d;
LPDIRECT3DDEVICE9 d3dDevice;
1

Другие решения

Измените Headers.h на

extern LPDIRECT3D9 d3d;
extern LPDIRECT3DDEVICE9 d3dDevice;

И положи

LPDIRECT3D9 d3d;
LPDIRECT3DDEVICE9 d3dDevice;

только в одном файле .cpp (Main.cpp будет делать)

1

По вопросам рекламы [email protected]