当用 C++ 构建项目时,我发现调试链接错误很棘手,尤其是在获取其他人的代码时。人们使用什么策略来调试和修复链接错误?

有帮助吗?

解决方案

不确定您的专业水平是什么,但这是基础知识。

下面是来自 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)” - 这是它找不到的符号,在本例中是一个名为 does_not_exist() 的函数

此时,在许多情况下,最快的解决方法是搜索该函数的代码库并找到实现位置。一旦您知道该功能在哪里实现,您只需确保这两个地方链接在一起即可。

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


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

其他提示

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

MSDN 文档可以很好地指出特定 Win32 API 调用需要哪个库(如果该库缺失)。

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

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

你心中有失败的经历吗?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top