链接错误,因为无法正确链接头文件到cpp文件

时间:2014-03-14 06:49:21

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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

这个理论太多了。现在,使.exe项目与.lib项目链接的最简单方法可能是添加引用:

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

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

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

答案 1 :(得分:0)

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

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

如上所述,可以获得有关这两个项目的更多信息,IDE(visual ???)......