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

调试链接错误的最佳实践 在C++中构建项目时,我发现调试链接错误是棘手的,尤其是在拾取别人的代码时。人们使用什么策略来调试和修复链接错误?,c++,visual-studio,gcc,linker,compilation,C++,Visual Studio,Gcc,Linker,Compilation,我遇到的一个常见链接错误是当函数的使用方式与其定义方式不同时。如果您看到这样的错误,您应该确保您使用的每个函数都在某个.h文件中正确声明。 您还应该确保所有相关的源文件都编译到同一个lib文件中。我遇到的一个错误是,我将两组文件编译到两个单独的库中,并且在库之间交叉调用 您是否想到了失败?C运行时库通常是最大的罪魁祸首。确保您的所有项目都具有相同的设置wrt单线程与多线程以及静态与dll MSDN文档可以很好地指出特定Win32 API调用在丢失时需要哪个库 除此之外,它通常归结为打开详细标志并

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


您是否想到了失败?

C运行时库通常是最大的罪魁祸首。确保您的所有项目都具有相同的设置wrt单线程与多线程以及静态与dll

MSDN文档可以很好地指出特定Win32 API调用在丢失时需要哪个库


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

不确定您的专业水平,但以下是基本知识

下面是VS2005中的一个链接器错误-是的,如果你不熟悉它,它将是一个巨大的混乱

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不存在(void)”-这是它找不到的符号,在本例中,一个名为does-not-exist()的函数
此时,在许多情况下,解决问题的最快方法是搜索此函数的代码库并找到实现的位置。一旦你知道函数在哪里实现,你只需要确保这两个地方联系在一起

如果您使用的是VS2005,您将使用“项目依赖项…”右键单击菜单。如果您使用的是gcc,那么可以在makefile中查找可执行文件生成步骤(gcc使用一堆.o文件调用),并添加缺少的.o文件



在第二个场景中,您可能缺少一个“外部”依赖项,而您没有相应的代码。Win32库通常在必须链接到的静态库中实现。在这种情况下,转到或并搜索API。在API描述的底部给出了库名称。将其添加到项目属性“配置属性->链接器->输入->其他依赖项”列表中。例如,函数timeGetTime()告诉您在页面底部使用Winmm.lib。

好吧,如果我找到了实现该方法的地方,并且没有发现任何问题,那么接下来该怎么办?有没有办法获取链接文件的列表?对于初学者来说,您的答案肯定很好,但这是链接器调试的头号结果,除了函数名输入错误之外,还有其他可能的原因。