【问题标题】:Best practices for debugging linking errors调试链接错误的最佳实践
【发布时间】:2010-09-07 06:57:58
【问题描述】:

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

【问题讨论】:

    标签: c++ visual-studio gcc linker compilation


    【解决方案1】:

    不确定您的专业水平,但这里是基本知识。

    以下是 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 中查找可执行文件生成步骤(使用一堆 .o 文件调用 gcc)并添加缺少的 .o 文件。


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

    【讨论】:

    • 好吧,如果我找到了实现该方法的地方并且没有发现任何问题,接下来我该怎么做?有没有办法获取正在链接的文件列表?您的回答肯定对初学者有好处,但这是链接器调试的前 1 个结果,除了函数名称中的拼写错误之外,还有其他可能的原因。
    【解决方案2】:

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

    你有没有想过失败?

    【讨论】:

      【解决方案3】:

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

      MSDN 文档非常适合指出特定 Win32 API 调用在缺少时需要哪个库。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-16
        • 2010-10-30
        • 2012-03-18
        • 1970-01-01
        • 2011-08-13
        • 2014-10-24
        相关资源
        最近更新 更多