类文件中出现未解析的外部符号 第一点:我不是C++专家,离它很远。大约一年前,我简单地浏览了一下,直到2周前我决定在C++中教自己DirectX时,它再也没有接触过。我犯过不少错误,但(大部分)我自己也能解决。不过我还是放弃了这个。据我所知,问题在于如何使用mapCube类的.h和.cpp文件,因此我将发布这些文件

类文件中出现未解析的外部符号 第一点:我不是C++专家,离它很远。大约一年前,我简单地浏览了一下,直到2周前我决定在C++中教自己DirectX时,它再也没有接触过。我犯过不少错误,但(大部分)我自己也能解决。不过我还是放弃了这个。据我所知,问题在于如何使用mapCube类的.h和.cpp文件,因此我将发布这些文件,c++,direct3d,C++,Direct3d,错误本身很少,但令人愤怒:我得到一个链接:2019关于mapCube的所有函数的未解决外部符号错误,除了构造函数,它告诉我它们在主程序中被引用,但声称它们未初始化。我知道的第二个错误与checkColl函数有关,仅在该函数中,VC++2010就决定x、y和z不再是mapCube类的一部分,这相当令人困惑 守则: mapCube.h #include <d3d9.h> #include <d3dx9.h> #include <dinput.h> extern

错误本身很少,但令人愤怒:我得到一个链接: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
#包括
#包括
#包括
外部施工浮动瓷砖宽度、瓷砖高度;
外部LPDIRECT3DDEVICE9 d3ddev;
//包括Direct3D库文件
#pragma注释(lib,“d3d9.lib”)
#pragma注释(lib,“d3dx9.lib”)
#pragma注释(lib,“dinput8.lib”)
#pragma注释(lib,“dxguid.lib”)
#ifndef MAPCUBE\u H
#定义MAPCUBE_H
类mapCube{
struct CUSTOMVERTEX{FLOAT X,Y,Z;D3DVECTOR NORMAL;DWORD COLOR;};//可能可以将它们放在其他位置
#定义CUSTOMFVF(D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_DIFFUSE)//它们已经在main中,但mapCube也需要它们
公众:
LPD3DX网格立方网格;
浮动x,y,z;
无效设置坐标(浮动,浮动,浮动);
D3DXVECTOR3 getCoord(){返回D3DXVECTOR3(x,y,z);};
mapCube();
mapCube(浮点,浮点,浮点);
mapCube(浮点、浮点、浮点、D3DXCOLOR);
空洞绘制(d3dx矩阵);
void setColor(D3DXCOLOR);
int checkColl(D3DXVECTOR3,D3DXVECTOR3);
};
#恩迪夫
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;
    }
}
#包括“mapCube.h”
mapCube::mapCube()
{
x=0;
y=0;
z=0;
setColor(D3DCOLOR_XRGB(128128));
} 
mapCube::mapCube(浮点nx、浮点ny、浮点nz)
{
x=nx;
y=ny;
z=nz;
setColor(D3DCOLOR_XRGB(128128));
}
mapCube::mapCube(浮点nx、浮点ny、浮点nz、D3DXCOLOR颜色)
{
x=nx;
y=ny;
z=nz;
设置颜色(颜色);
}
void mapCube::setCoord(float nx、float ny、float nz)//此函数和下一个函数都被调用
{//因为我正在使用
x=nx;//一个立方体数组,而不是一个接一个
y=ny;
z=nz;
};
void mapCube::setColor(D3DXCOLOR)//基本上只为每个顶点的“颜色”着色
{
LPD3DXMESH tmpMesh=NULL;
D3DXCreateBox(d3ddev、平铺宽度、平铺高度、平铺宽度和tmpMesh,NULL);
tmpMesh->CloneMeshFVF(0、自定义FVF、d3ddev和立方体网格);
LPDIRECT3DVERTEXBUFFER9 TMPVertBuff=NULL;
if(成功(cubeMesh->GetVertexBuffer(&tmpVertBuf)))
{
int nNumVerts=cubeMesh->GetNumVertices();
CUSTOMVERTEX*pVertices=NULL;
tmpVertBuf->Lock(0,0,(void**)和pVertices,0);
{
int i=0;
while(iUnlock();
tmpVertBuf->Release();
}
};
void mapCube::draw(D3DXMATRIX matWorld)
{
d3dx矩阵matTranslate;
D3DXMatrixTranslation(&MattTranslate,x,y,z);//转换到存储的多维数据集坐标
d3ddev->SetTransform(D3DTS_WORLD,&(matTranslate*matWorld));/…与全世界变换相结合
立方网格->绘图子集(0);
};
int checkColl(D3DXVECTOR3 vecTest,D3DXVECTOR3 vecThis)//第二个arg bc编译器决定忘记
{//这个类有x,y,z变量

如果(vecTest.x>=vecThis.x-(TILE_-WIDTH/2.0f)| vecTest.x=vecThis.z-(TILE_-HEIGHT/2.0f)| vecTest.z认为值得指出明显的出血,但是mapCube.cpp是否包含在您的项目中?第二个问题很容易解决:检查实现(在
mapCube.cpp
中)缺少其
mapCube::
前缀。这会导致编译器认为它是一个“自由函数”,而不是
mapCube

的成员函数。也许您忘了将mapCube.cpp添加到VC++项目中。请将此行添加到mapCube.cpp的顶部:

#error This file is indeed being compiled
如果该行未生成编译器错误,则不会编译mapCube.cpp



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

在包含任何内容之前,你的
MAPCUBE\u H
头保护应该位于头文件的顶部。谢谢,从来都不太适合错误检查之类的内容,所以我想这就是我得到的整天盯着代码看,这是一个不好的时刻……谢谢。好的一面和坏的一面:坏的(在解决问题方面)=它打印了错误好的=我肯定它正在编译,而且措辞给了我一个非常需要的笑声你确实将mapCube.cpp作为源文件添加到了你的项目中(添加源文件),并且没有做一些愚蠢的事情,比如
#包括“mapCube.cpp”
,对吗?您也可以尝试重建解决方案。有时事情会不同步,您只需从头开始重新编译所有内容。我只包含类的头文件,但在重建之后,我不再收到链接:2019错误…现在我收到LNK4042警告。因此它现在确实运行了,尽管我对此感到好奇rning。谢谢您的帮助。@coderCobra:至于LNK4042警告,可能是因为您在多个模块中定义了相同的全局变量。“Public”全局变量应该在头文件中声明
extern
,并且在一个源文件中只定义一次。如果您编辑您的问题以显示最近的inker警告,那么也许我们可以为您提供有关该问题的信息。