我目前正在尝试设置一个基本应用程序,并且我想使用 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。
头文件.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
主文件
#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()
{
}
刚体.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
};
圈子.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
全局头文件中并使用包含防护将其包围。这适用于我的上一个项目,我将两者进行了比较,没有明显差异。
我弄乱了警卫标识符,认为它可能无效或在其他地方使用,并且使用我能想到的最独特的警卫标识符给我带来了同样的错误。
当我放:
LPDIRECT3D9 d3d;
LPDIRECT3DDEVICE9 d3dDevice;
在 Main.cpp 中并将其从 Headers.h 文件中取出,项目编译良好。但是,我不想这样做,因为我想LPDIRECT3DDEVICE9
从每个对象中访问,因为这是我打算设置原始形状的地方。