zoukankan      html  css  js  c++  java
  • 无法解析的外部符号 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传递的变量如果没有暴露出来,会报此错误.(摘自我的印象笔记,具体发生的情形记不清了。)

    新战场:https://blog.csdn.net/Stephen___Qin
  • 相关阅读:
    Fiddler 的几个用法
    jQuery中ajax的使用和缓存问题解决 $getjson 与$get都会被IE缓存
    http与https的区别以及https的加密原理
    asp.net mvc通过预处理实现数据过滤和数据篡改。
    C# winform的WebBrowser非常规编程(强烈推荐)
    DES加密 java与.net可以相互加密解密的方法
    日常开发中常见的HTTP协议的状态码
    前端性能监控
    在手机的浏览器上通过连接打开App
    工作五年总结一二三流公司的常见特性
  • 原文地址:https://www.cnblogs.com/Stephen-Qin/p/12152254.html
Copyright © 2011-2022 走看看