【问题标题】:linking error for not being able to link header file to cpp file correctly无法将头文件正确链接到 cpp 文件的链接错误
【发布时间】:2014-03-14 06:49:20
【问题描述】:

我在一个解决方案中有两个项目。当我尝试从另一个项目访问一个项目的功能时,我得到error LNK2001: unresolved external symbol。但是只有当函数在头文件中声明但在相应的cpp文件中定义时才会发生链接错误。如果函数在头文件中定义,则不会发生错误。从同一个项目调用函数也不会给出任何错误。仅从另一个结果调用链接错误。

编辑:我使用的是 Visual Studio 2010。我不知道是否值得一提的是,被调用的函数位于输出 lib 文件的项目中,而调用该函数的项目输出 exe 文件。

【问题讨论】:

  • 您使用的是哪个 IDE? “项目”和“解决方案”是特定于 IDE 的术语。也许将其添加为标签?
  • 编辑了我的问题。谢谢。
  • 只需将带有定义的 cpp 文件添加到您的项目中
  • @Sergey 我该怎么做?
  • 在windows上你可以通过drug'n'drop从文件夹到打开的项目或使用ide菜单命令来完成

标签: c++ visual-studio-2010 linker


【解决方案1】:

如果你在头文件中定义函数,编译器会在你构建.exe项目时看到函数实现,并将函数代码的副本直接编译到你的.exe项目中。在构建期间轮到链接器时,不会丢失任何内容,因此链接器很高兴,您不会收到错误消息。

如果在 .cpp 文件中定义函数,编译器将看不到函数实现。因此,它将引用稍后需要在构建期间轮到链接器时解析的函数(即外部符号)。要使链接器“看到”外部符号,您需要将 .exe 项目与 .lib 项目链接起来。建立此链接依赖关系后,链接器将能够找到外部符号并解析对编译器先前生成的函数的引用。因为您有一个 .lib 项目,它是一个静态库项目,所以链接器通过从 .lib 文件中获取函数的代码并将代码的副本放入您的 .exe 文件中来解析符号。

理论就讲这么多。现在,将 .exe 项目链接到 .lib 项目的最简单方法可能是添加引用:

  • 在 .exe 项目的设置中,选择部分列表顶部名为“Common Properties”的部分。
  • 您现在应该会看到 .exe 项目具有的引用列表。该列表可能为空。
  • 单击对话框底部的“添加新引用”按钮并将 .lib 项目添加为引用
  • 当您在参考列表中选择新参考时,您将看到该参考的一组属性。确保名为“Link Library Dependencies”的属性设置为 true。这将导致 .lib 项目在您构建 .exe 项目时自动添加为链接器的输入。

如果您构建 .exe 项目,链接器错误现在应该消失了。

顺便说一句,通过添加项目引用,您还告诉 Visual Studio 在构建整个解决方案时以正确的顺序构建两个项目:首先是 .lib 项目,然后是 .exe 项目。

【讨论】:

    【解决方案2】:

    链接器的作用是解析未知符号。

    因此,如果项目 A 使用 cpp 文件中定义的项目 B 中的方法,则需要将 A 链接到 B。

    如前所述,最好有关于这两个项目的更多信息,IDE(视觉???)...

    【讨论】:

    • 我正在使用 Visual Studio 2010。谢谢。
    猜你喜欢
    • 2017-03-02
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多