C++ 向量操作错误

3

我目前在我的程序中使用了一个向量,但是在开始使用这个类之后,出现了一些奇怪的错误。

这些错误包括:

1>MyCloth.obj : error LNK2019: unresolved external symbol __CrtDbgReportW referenced in function "public: unsigned int & __thiscall std::vector<unsigned int,class std::allocator<unsigned int> >::operator[](unsigned int)" (??A?$vector@IV?$allocator@I@std@@@std@@QAEAAII@Z)
1>libcpmtd.lib(stdthrow.obj) : error LNK2001: unresolved external symbol __CrtDbgReportW
1>D:\Licenta\Project\IOPBTS\Debug\IOPBTS.exe : fatal error LNK1120: 1 unresolved externals

我的代码如下:

在头文件中:

#undef vector
#include <vector>

void findPieceVertices(NxU32 selectedVertex); 
bool checkVertexExistsInClothPieceElements(int vertex);
void findVertexTriangles(NxU32 vertex);
std::vector<NxU32> clothPieceElements;

在cpp文件中:
bool MyCloth::checkVertexExistsInClothPieceElements(int vertex)
{
for(int i=0;i<clothPieceElements.size();i++)
    if(clothPieceElements[i]==vertex)
        return true;
return false;
}

void MyCloth::findVertexTriangles(NxU32 vertex)
{
NxMeshData data = mCloth->getMeshData();
NxU32* vertices = (NxU32*)data.indicesBegin;
NxU32 aux = 0;

for(int i=0;i<(mInitNumVertices-1)*3;i+=3)
{
    if(*vertices == vertex || *(vertices+1) == vertex || *(vertices+2) == vertex)
    {
        if(!checkVertexExistsInClothPieceElements(*vertices))
            clothPieceElements.push_back(*vertices);
        if(!checkVertexExistsInClothPieceElements(*(vertices+1)))
            clothPieceElements.push_back(*(vertices+1));
        if(!checkVertexExistsInClothPieceElements(*(vertices+2)))
            clothPieceElements.push_back(*(vertices+2));
    }
    vertices = vertices + 3;
}

}

void MyCloth::findPieceVertices(NxU32 selectedVertex)
{
clothPieceElements.push_back(selectedVertex);
int i=0;
while(i<clothPieceElements.size())
{
    findVertexTriangles(clothPieceElements[i]);
    i++;
}

}

我到底做错了什么?我在网上找到一些资料,说我使用的文件是在发布模式下编译的,我也应该这样做。问题是,如果我在发布模式下编译,这些错误就会消失,但我的程序无法找到一个非常重要的非C库,它被指向了VCC Directories->Include directories中添加的路径。
有人知道为什么会出现这个错误吗?或者它意味着什么?
另外,有人能告诉我在调试模式和发布模式下构建的区别吗?

默认情况下,发布版本会进行更多的优化,因此程序更小更快,但更难调试。我认为调试还会将一些东西设置为0xCECECE,并在指针溢出时中断而不是通过始终分配一个字节来崩溃。要在Proj设置中将lib设置为发布模式,请将调试更改为发布,然后在那里设置包含文件。据我所知,所有库都应该在发布和调试模式下工作。 - mwerschy
我认为您没有链接到正确的运行时库:在 Debug 配置下需要调试版本(某些断言需要 CrtDbgReport)。 - Liviu
链接到调试模式下的发布版本不应该总是有效吗?我认为它只是不能像调试模式下那样进行调试。 - mwerschy
谢谢您的回复,我正在使用一个物理引擎,并且我只是使用他们提供的库文件,但您可能是正确的,我可能已经使用了调试版本,因此它在发布版本中无法正常工作。 - user2399378
2个回答

5
看起来你在CRT库方面出现了一些问题。Debug和Release版本有两个主要差异:
  • 使用不同的CRT库
  • 对代码进行了不同的优化
这两点都与你的问题有关。首先,请查看此评论。看起来你的链接行中缺少libcmtd.lib。请检查链接器->输入选项下,确保你没有将重要库从链接中排除。
函数__CrtDbgReportW与调试版中vector::operator[]执行的某些运行时检查相关。由于这些检查在发布版中被禁用,所以在发布版本中不会出现此错误。
还请确保在C/C++ -> 代码生成选项下使用适当的CRT版本。Debug配置应该有一个调试版本(动态或静态),Release配置应该有一个发布版本。
这是一个需要经验才能解决的棘手问题。如果可能的话,我建议从默认模板创建一个新项目,并将所有文件添加到该新项目中,以确保默认情况下设置正确。

1

好的,我解决了。问题出在C/C++ -> 代码生成 -> 运行时库上。我使用了/MT,但实际需要使用/MTd(调试)。现在它可以工作了。我只从项目中排除了LIBCD库,我正在使用GLUI,否则该项目将无法正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接