2014-03-14 46 views
0

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

编辑:我正在使用visual studio 2010.我不知道是否值得一提的是被调用的函数是在一个项目中输出一个lib文件,并调用该函数输出一个exe文件。

+0

您正在使用哪个IDE? “项目”和“解决方案”是IDE特定的术语。也许把它添加为标签? – Svaberg

+0

编辑我的问题。谢谢。 – Tahlil

+0

只需在您的项目中添加带定义的cpp文件 –

回答

2

如果您在头文件中定义函数,编译器将在生成.exe项目并将函数代码的副本直接编译到.exe项目时看到函数实现。在构建过程中,当链接器轮到时,没有任何东西丢失,所以链接器很快乐,并且不会收到错误消息。

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

这么多理论。现在,让您的.exe项目链接对你的.lib项目可能是最简单的办法就是通过增加一个参考:

  • 在.exe项目的设置,选择名为“公共属性”一节在部分的顶部名单。
  • 您现在应该看到.exe项目具有的引用列表。该列表可能是空的。
  • 单击对话框底部的“添加新引用”按钮并添加.lib项目作为参考
  • 当您在引用列表中选择新引用时,您将看到该引用的一组属性。确保名为“链接库依赖关系”的属性设置为true。这将导致.lib项目在生成.exe项目时作为链接器的输入自动添加。

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

顺便提一下,通过添加项目引用,您还告诉Visual Studio如果构建整个解决方案,则按正确顺序构建两个项目:首先是.lib项目,然后是.exe项目。

+0

关于时间:D非常感谢。它的工作原理:D – Tahlil

0

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

因此,如果谟A使用在CPP文件中定义从谟B分析方法,你需要连接一个反对B.

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

+0

我正在使用visual studio 2010.谢谢。 – Tahlil