调试链接错误的最佳实践

问题描述:

在C++中构建项目时,我发现调试链接错误非常棘手,尤其是在挑选其他人的代码时。人们使用什么策略来调试和修复链接错误?调试链接错误的最佳实践

不知道你的专业水平是什么,但这里有基础知识。

下面是VS 2005的链接器错误 - 是的,如果你不熟悉它,这是一个巨大的混乱。

ByteComparator.obj : error LNK2019: unresolved external symbol "int __cdecl does_not_exist(void)" ([email protected]@YAHXZ) referenced in function "void __cdecl TextScan(struct FileTextStats &,char const *,char const *,bool,bool,__int64)" ([email protected]@[email protected]@[email protected]) 

有几个点集中在:

  • “ByteComparator.obj” - 寻找一个ByteComparator.cpp文件,这是连接问题
  • “INT源__cdecl does_not_exist(无效)” - 这是它无法找到符号,在这种情况下,功能名为does_not_exist()

在这一点上,在许多情况下分辨率的最快方法是搜索t他为此函数编写代码并查找实现的位置。一旦你知道该函数在哪里实现,你只需要确保两个地方连接在一起。

如果您使用的是VS2005,您可以使用“Project Dependencies ...”右键菜单。如果你使用的是gcc,你可以在makefile文件中查看可执行文件的生成步骤(用一堆.o文件调用gcc)并添加缺少的.o文件。


在第二种情况下,您可能会缺少没有代码的“外部”依赖项。 Win32库通常在静态库中实现,您必须链接到这些库。在这种情况下,请转至MSDN"Microsoft Google"并搜索API。在API描述的底部给出库名称。将其添加到项目属性“Configuration Properties-> Linker-> Input-> Additional Dependencies”列表中。例如,函数timeGetTime()的page on MSDN告诉您在页面底部使用Winmm.lib。

+0

那么,如果我找到了实施该方法的地方,并且我没有发现任何问题,我下一步该做什么?有没有办法获得链接的文件列表?您的答案对初学者来说确实很好,但这是链接器调试的前1名结果,并且在函数名称中还有其他可能的原因,而不是拼写错误。 – 2015-10-26 14:01:11

我遇到的一个常见链接错误是函数的使用与定义方式不同。如果你看到这样的错误,你应该确保你使用的每个函数都在某个.h文件中正确声明。
您还应该确保所有相关的源文件都被编译到同一个lib文件中。我遇到的一个错误是,当我有两组文件被编译成两个独立的库时,我在库之间进行了交叉调用。

你有没有想到失败?

+0

这个交叉调用,它给出了什么类型的错误? – Doug 2013-01-24 19:01:39

C运行时库往往是最大的罪魁祸首。确保你的所有项目都具有相同的设置,包括单线程和多线程以及静态与dll。

MSDN文档很适合指出特定Win32 API调用需要的库,如果它缺少的话。

除此之外,它通常归结为打开详细标志和涉水寻找线索输出。