未解决的外部符号与类文件的关系

时间:2011-07-28 23:47:15

标签: c++ direct3d

第一点:我不是C ++专家,远非如此。我差不多一年前瞥了一眼它,直到大约两周前我决定用C ++教自己DirectX时才再次触及它。我有很多错误但是(大部分)能够自己解决。我虽然放弃了这个。据我所知,问题在于我如何使用mapCube类的.h和.cpp文件,所以我将发布这些文件。

错误本身很少但很令人愤怒:我得到了一个 LINK:2019 未解决的外部符号错误,关于mapCube的所有功能构造函数外,它告诉我它们是在主程序中引用但声称它们未初始化。我知道的第二个错误与checkColl函数有关,仅在该函数中,VC ++ 2010决定x,y和z不再是mapCube类的一部分,而是相当困惑。

代码: mapCube.h

#include <d3d9.h>
#include <d3dx9.h>
#include <dinput.h>

extern const float TILE_WIDTH, TILE_HEIGHT;
extern LPDIRECT3DDEVICE9 d3ddev;

// include the Direct3D Library files
#pragma comment (lib, "d3d9.lib")
#pragma comment (lib, "d3dx9.lib")
#pragma comment (lib, "dinput8.lib")
#pragma comment (lib, "dxguid.lib")

#ifndef MAPCUBE_H
#define MAPCUBE_H

class mapCube{
        struct CUSTOMVERTEX {FLOAT X, Y, Z; D3DVECTOR NORMAL; DWORD COLOR;};    //might be able to put these elsewhere
        #define CUSTOMFVF (D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_DIFFUSE)             //they are already in main, but mapCube needs them too
public:
    LPD3DXMESH cubeMesh;
    float x,y,z;
    void setCoord(float, float, float);
    D3DXVECTOR3 getCoord(){return D3DXVECTOR3(x,y,z);};
    mapCube();
    mapCube(float, float, float);
    mapCube(float, float, float, D3DXCOLOR);
    void draw(D3DXMATRIX);
    void setColor(D3DXCOLOR);
    int checkColl(D3DXVECTOR3, D3DXVECTOR3);
};

#endif

mapCube.cpp

#include "mapCube.h"

mapCube::mapCube()
{
    x=0;
    y=0;
    z=0;
    setColor(D3DCOLOR_XRGB(128,128,128));
} 

mapCube::mapCube(float nx, float ny, float nz)
{
    x=nx;
    y=ny;
    z=nz;
    setColor(D3DCOLOR_XRGB(128,128,128));
}

mapCube::mapCube(float nx, float ny, float nz, D3DXCOLOR color)
{
    x=nx;
    y=ny;
    z=nz;
    setColor(color);
}

void mapCube::setCoord(float nx, float ny, float nz)    //this function and the next one are both called
{                                                       //when the cube is created because I'm using
        x=nx;                                               //an array of cubes instead of one-by-one
    y=ny;
    z=nz;
};

void mapCube::setColor(D3DXCOLOR color)             //basically just colors each vertex 'color'
{
    LPD3DXMESH tmpMesh=NULL;

    D3DXCreateBox(d3ddev, TILE_WIDTH, TILE_HEIGHT, TILE_WIDTH, &tmpMesh, NULL);

    tmpMesh->CloneMeshFVF( 0, CUSTOMFVF, d3ddev, &cubeMesh );

    LPDIRECT3DVERTEXBUFFER9 tmpVertBuf=NULL;

if( SUCCEEDED(cubeMesh->GetVertexBuffer(&tmpVertBuf)))
{
    int nNumVerts = cubeMesh->GetNumVertices();
    CUSTOMVERTEX *pVertices = NULL;

    tmpVertBuf->Lock( 0, 0, (void**)&pVertices, 0 );
    {
            int i=0;
            while(i<nNumVerts)
            {
                pVertices[i].COLOR=color;
                i++;
            }
        }
    tmpVertBuf->Unlock();

    tmpVertBuf->Release();
    }
};

void mapCube::draw(D3DXMATRIX matWorld)
{
    D3DXMATRIX matTranslate;
    D3DXMatrixTranslation(&matTranslate,x,y,z);         //translation to the cubes stored coordinates

    d3ddev->SetTransform(D3DTS_WORLD, &(matTranslate * matWorld));      //...combined with the total world transform
    cubeMesh->DrawSubset(0);
};

int checkColl(D3DXVECTOR3 vecTest, D3DXVECTOR3 vecThis)         //2nd arg bc compiler decided to forget
{                                                               //that this class has x,y,z vars
    if(vecTest.x>=vecThis.x-(TILE_WIDTH/2.0f) || vecTest.x<=vecThis.x+(TILE_WIDTH/2.0f))    //rudimentary attempt at collision checking
    {
        return 1;
    }
    else if(vecTest.z>=vecThis.z-(TILE_HEIGHT/2.0f) || vecTest.z<=vecThis.z+(TILE_HEIGHT/2.0f))
    {
        return 2;
    }
    else
    {
        return 0;
    }
}

很抱歉,如果格式有点偏,这是我第一次使用此界面。在我将最后一个函数中的x / z引用更改为传递的D3D向量之后,编译器不会报告语法错误。任何帮助/批评都是受欢迎的,无论是与d3d还是c ++有关。我没有发布主要来源,因为我不相信问题存在,但如果被问到我也会发布。

在解决了这个问题之后,我现在注意到这个警告:     1&gt; Debug \ mapCube.obj:警告LNK4042:指定了多次的对象;临时演员被忽略了 我删除了CUSTOMVERTEX和FVF的重复定义,并在标题中将它们作为extern,但无法解决这些问题。

3 个答案:

答案 0 :(得分:0)

只是觉得值得指出流血明显,但是你的项目中是否包含了mapCube.cpp?

答案 1 :(得分:0)

第二个问题很容易解决:checkColl实施(在mapCube.cpp中)缺少其mapCube::前缀。这会导致编译器认为它是“自由函数”,而不是mapCube的成员函数。

答案 2 :(得分:0)

也许您忘记将mapCube.cpp添加到VC ++项目中。将此行添加到mapCube.cpp的顶部:

#error This file is indeed being compiled

如果该行没有生成编译器错误,则不会编译mapCube.cpp。


尝试重建解决方案。有时事情会不同步,你只需要从头开始重新编译。