错误LNK2005已经定义 - 编译运行后编译时出错

问题描述:

我正在尝试关注Riemer's DirectX with C++ tutorial错误LNK2005已经定义 - 编译运行后编译时出错

我做了一些改变,例如在这里我已经在一个单独的文件(tdirect.cpp/tdirect.h)中使我的InitializeDevice()函数。

当我按F5编译并运行时,程序完美运行。但是,当我改变一个值(例如0xff00ffff0xff0000ff - 青色到蓝色)没有选择“重建”选项我在我的控制台中得到一串错误,使我无法编译程序。你可以想象这很烦人。就好像它正在编译tdirect.cpp两次。

下面是tdirect.cpptdirect.h的源代码,和相关部分从main.cpptdirect.hmain.cpp包括在内,basicvertex.h仅从tdirect.cpp包括)

tdirect.cpp

#include "tdirect.h" 
#include "basicvertex.h" 

IDirect3D9 *pD3D; 
D3DPRESENT_PARAMETERS D3DParams; 

LPDIRECT3DDEVICE9 InitializeDevice(HWND Wnd) 
{ 
    pD3D = Direct3DCreate9(D3D_SDK_VERSION); 
    if (pD3D == NULL) 
    { 
     MessageBox(Wnd, "DirectX is not installed.", "No DirectX!", MB_OK); 
     return NULL; 
    } 

    ZeroMemory(&D3DParams, sizeof(D3DPRESENT_PARAMETERS)); 

    D3DParams.Windowed = TRUE; 
    D3DParams.SwapEffect = D3DSWAPEFFECT_DISCARD; 
    D3DParams.BackBufferFormat = D3DFMT_UNKNOWN; 

    LPDIRECT3DDEVICE9 pDevice; 
    if (FAILED(pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, Wnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &D3DParams, &pDevice))) 
    { 
     if (FAILED(pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, Wnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &D3DParams, &pDevice))) 
     { 
      MessageBox(Wnd, "Failed to create reference device.", "No software device!", MB_OK); 
     } 
     else { 
      MessageBox(Wnd, "Falling back to software mode.", "No hardware device!", MB_OK); 
     } 
    } 

    return pDevice; 
} 

LPDIRECT3DVERTEXBUFFER9 vBuffer; 
void Init(LPDIRECT3DDEVICE9 pDevice) 
{ 
    BASICVERTEX Vertices[3]; 
    Vertices[0].x = 150; 
    Vertices[0].y = 100; 
    Vertices[0].weight = 1; 
    Vertices[0].colour = 0xffff0000; 

    Vertices[1].x = 350; 
    Vertices[1].y = 100; 
    Vertices[1].weight = 1; 
    Vertices[1].colour = 0xff00ff00; 

    Vertices[2].x = 250; 
    Vertices[2].y = 300; 
    Vertices[2].weight = 1; 
    Vertices[2].colour = 0xff00ffff; 

    if (FAILED(pDevice->CreateVertexBuffer(sizeof(BASICVERTEX)*3, 0, D3DFVF_XYZRHW | D3DFVF_DIFFUSE, D3DPOOL_DEFAULT, &vBuffer, NULL))) 
    { 
     MessageBox(NULL, "Failed to create vertex buffer", "Fail", MB_OK); 
    } 
    else { 
     void* pVertices; 
     if (FAILED(vBuffer->Lock(0, sizeof(BASICVERTEX)*3, (void**)&pVertices, 0))) 
     { 
      MessageBox(NULL, "Failed to lock vertex buffer", "Fail", MB_OK); 
     } 
     else { 
      memcpy(pVertices, Vertices, sizeof(BASICVERTEX)*3); 
      vBuffer->Unlock(); 
     } 
    } 
} 

void DrawScene(LPDIRECT3DDEVICE9 pDevice) 
{ 
    pDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0); 
    pDevice->BeginScene(); 

    pDevice->SetStreamSource(0, vBuffer, 0, sizeof(BASICVERTEX)); 
    pDevice->SetFVF(D3DFVF_XYZRHW | D3DFVF_DIFFUSE); 
    pDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1); 

    pDevice->EndScene(); 
    pDevice->Present(NULL, NULL, NULL, NULL); 
} 

tdirect.h

#pragma once 
#include <Windows.h> 

main.cpp包括部分

#include <Windows.h> 

#include "dxheader.h" 
#include "tdirect.cpp" 

编译器错误:

1>Debug\tdirect.obj : warning LNK4042: object specified more than once; extras ignored 
1>main.obj : error LNK2005: "struct IDirect3DDevice9 * __cdecl InitializeDevice(struct HWND__ *)" ([email protected]@[email protected]@[email protected]@@Z) already defined in tdirect.obj 
1>main.obj : error LNK2005: "void __cdecl Init(struct IDirect3DDevice9 *)" ([email protected]@[email protected]@@Z) already defined in tdirect.obj 
1>main.obj : error LNK2005: "void __cdecl DrawScene(struct IDirect3DDevice9 *)" ([email protected]@[email protected]@@Z) already defined in tdirect.obj 
1>main.obj : error LNK2005: "struct IDirect3DVertexBuffer9 * vBuffer" ([email protected]@[email protected]@A) already defined in tdirect.obj 
1>main.obj : error LNK2005: "struct _D3DPRESENT_PARAMETERS_ D3DParams" ([email protected]@[email protected]@A) already defined in tdirect.obj 
1>main.obj : error LNK2005: "struct IDirect3D9 * pD3D" ([email protected]@[email protected]@A) already defined in tdirect.obj 
1>C:\Users\me\Documents\Visual Studio 2010\Projects\DirectX\Debug\DXStuff.exe : fatal error LNK1169: one or more multiply defined symbols found 

感谢提前:)

+0

不要这样做! – forsvarir 2011-05-04 21:35:34

+0

所以你是说做一个完整的重建工作,你没有得到任何链接错误或警告? – Troubadour 2011-05-04 21:50:39

+0

完全重建工作,是的,没有链接器错误。不过,我收到了一些关于它已经被忽略的已定义符号的警告。 – Toneo 2011-05-05 15:26:45

您正在从main.cpp中包含实现文件,因此它将再次添加函数。你可以这样做:

#include "tdirect.cpp" 

相反,你需要创建一个头文件与函数原型,所以你可以参考他们...

你已经在你的“tdirect.h”这些定义(这是什么main.cpp应该包括)?在主的#include “tdirect.cpp”:

LPDIRECT3DDEVICE9 InitializeDevice(HWND Wnd); 

等等

+0

感谢您的支持!我已经这样做了,但是他们在我试图找到问题时被注释掉了(实际上,这只是我忘记为我后来添加的函数添加原型) 我仍然在收到“Debug \ tdirect”。 obj:警告LNK4042:多次指定对象; extras忽略“,但实际上这次是编译。 – Toneo 2011-05-05 15:27:29