调试链接错误的最佳实践
时间:2020-03-05 18:45:08 来源:igfitidea点击:
使用C ++构建项目时,我发现调试链接错误非常棘手,特别是在拾取其他人的代码时。人们使用哪些策略来调试和修复链接错误?
解决方案
回答
我遇到的常见链接错误之一是函数的使用方式与定义方式不同。如果看到这样的错误,则应确保在某个.h文件中正确声明了我们使用的每个函数。
我们还应该确保所有相关的源文件都被编译到同一个lib文件中。我遇到的一个错误是,我将两组文件编译到两个单独的库中,并且在库之间进行交叉调用。
我们是否有失败的念头?
回答
C运行时库通常是最大的罪魁祸首。确保所有项目在单线程与多线程以及静态与dll中都具有相同的设置。
MSDN文档非常适合指出某个Win32 API调用丢失时需要哪个库。
除此之外,它通常归结为打开详细标志并在输出中涉猎以寻找线索。
回答
不确定专业水平是多少,但是这里是基础知识。
下面是来自VS 2005的链接器错误,是的,如果我们不熟悉它,那将是一个巨大的混乱。
ByteComparator.obj : error LNK2019: unresolved external symbol "int __cdecl does_not_exist(void)" (?does_not_exist@@YAHXZ) referenced in function "void __cdecl TextScan(struct FileTextStats &,char const *,char const *,bool,bool,__int64)" (?TextScan@@YAXAAUFileTextStats@@PBD1_N2_J@Z)
有两点需要重点注意:
- " ByteComparator.obj"-查找ByteComparator.cpp文件,这是链接器问题的根源
- " int __cdecl does_not_exist(void)"-这是它找不到的符号,在这种情况下,名为dos_not_exist()的函数
此时,在许多情况下,解决问题的最快方法是在代码库中搜索该功能并找到实现的位置。一旦知道了函数的实现位置,我们只需确保将两个位置链接在一起。
如果使用的是VS2005,则可以使用"项目依赖项..."右键单击菜单。如果我们使用的是gcc,则应在makefile中查找可执行文件生成步骤(gcc用一堆.o文件调用),然后添加缺少的.o文件。
在第二种情况下,我们可能会缺少没有代码的"外部"依赖项。 Win32库通常是在必须链接到的静态库中实现的。在这种情况下,请转到MSDN或者" Microsoft Google"并搜索API。在API说明的底部给出了库名。将此添加到项目属性"配置属性->链接器->输入->其他依赖项"列表中。例如,MSDN上的timeGetTime()函数页面告诉我们使用页面底部的Winmm.lib。