我在一个解决方案中有两个项目。当我尝试从另一个项目访问一个项目的功能时,我得到error LNK2001: unresolved external symbol
。但是只有当函数在头文件中声明但在相应的cpp文件中定义时,才会发生链接错误。如果函数在头文件中定义,则不会发生错误。从同一个项目调用函数也不会给出任何错误。只能从另一个调用导致链接错误。
答案 0 :(得分:2)
如果在头文件中定义函数,编译器将在构建.exe项目时看到函数实现,并将函数代码的副本直接编译到.exe项目中。当链接器在构建期间转向时,没有任何内容丢失,因此链接器很高兴,您将不会收到错误消息。
如果在.cpp文件中定义函数,编译器将看不到函数实现。因此,它将引用在构建期间链接器转向时需要稍后解析的函数(即外部符号)。要使链接器“看到”外部符号,您需要将.exe项目与.lib项目链接。一旦建立了此链接依赖关系,链接器就能够找到外部符号并解析对编译器先前生成的函数的引用。因为你有一个.lib项目,它是一个静态库项目,链接器通过从.lib文件中获取该函数的代码来解析符号,并将代码的副本放入.exe文件中。
这个理论太多了。现在,使.exe项目与.lib项目链接的最简单方法可能是添加引用:
如果您构建.exe项目,则链接器错误现在应该消失。
顺便说一句,通过添加项目引用,如果构建整个解决方案,您还告诉Visual Studio以正确的顺序构建两个项目:首先是.lib项目,然后是.exe项目。
答案 1 :(得分:0)
链接器的作用是解析未知符号。
因此,如果projet A使用cpp文件中定义的projet B中的方法,则需要将A与B链接。
如上所述,可以获得有关这两个项目的更多信息,IDE(visual ???)......