无法解析的外部符号 LNK错误总结
错误分析:
这是在链接过程中的报错,之所以在这里报错,而没有在编译过程中报错,说明包含报错方法的.h文件已经被包含了,但对应的cpp文件或者库文件链接器没有找到,所以它就很委屈地报了这个错误.
那会有哪些可能的原因导致这个问题呢?
1.缺少对应的cpp文件(比如下图中,在main.cpp中,添加了.h文件,但是项目中没有对应的函数的实现文件.一开始我对LNK报错很抵触,因为它的报错信息看着太难受了.后来发现只需要看几个关键信息就可以了:是哪个obj文件下的,报错的函数名是什么)
2.缺少对应lib文件
2.1 lib文件压根就没有添加或者路径错误(看下VS中的库目录有没有添加,或者在代码中搜索"#pragma comment(lib, )")
2.2 lib文件的版本对应不上 (这个有时候很难想到,比如当时用windbg的lib,VS里的环境是32位,自己没想太多把64位的lib路径添加进去)
3.cpp文件存在,但没有放到合适的位置.
之前一直搞不明白为何有的包含cpp的文件夹要添加到VS的项目,后来了解到如果不添加到项目中,编译过程中找不到cpp文件对应的函数,所以就没有生成对应的obj文件,但编译期间不会报错.但是在链接时,别的obj去找它找不到就会报错咯.
昨天认识到,你把头文件路径加到代码中,编译的时候就知道有这个函数,所以一些依赖的头文件就不必添加到VS的项目视图中(只要在代码中能够找到就行了).而cpp就不一样了,编译时把它变成obj文件,链接的时候再把这些obj文件串联起来,所以需要让系统知道cpp在哪.
认识到库文件是obj文件的集合,它一方面能够让别人调用起来更方便(如果你把这些源文件添加到项目中,会恶心死自己);另一方面节省了编译的过程;再者使用库文件能够保证代码的私密性.
4.从github上下载的仓库,如果用3方法手动去添加到项目中,也有可能会出现该错误(估计实际编译需要更多的配置).因此需要按照文档中说明去编译,比如使用cmake之类的.
5。不同模块之间通过extern传递的变量如果没有暴露出来,会报此错误.(摘自我的印象笔记,具体发生的情形记不清了。)