VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 4064|回复: 3

[求助] LNK2019: 无法解析的外部符号

[复制链接]
56_avatar_middle
在线会员 发表于 2015-8-31 16:08:11 | 显示全部楼层 |阅读模式
3驿站币
昨天写的一个顺序表,出现了 LNK2019: 无法解析的外部符号,这个问题我在网上查找了一下
大概分为一下几种原因,但我检查了一下,应该是第一种错误,但是我应该并没有写错希望诸位大神过来看看!
在C++编程过程中,出的一类较多的错误就是“error LNK2019: 无法解析的外部符号”,一般来说,对于语法错误的提示,往往可以在较短的时间里修正

并取得成效,如果是通过测试发现的逻辑错误呢也可以通过跟踪调试找到问题所在,当然后者排错花费的精力相对要大些,不过终归使用正规的路子还是

可以顺藤摸瓜解决问题的,最令初学者头疼的就是link error链接错误,只要编译器报连接错误,往往让大家丈二和尚摸不着头脑,下面就我个人的经验

谈谈出现link错误及排解的方法:

        原因一:用户自定义的类中的函数声明与函数定义分开写时,函数名写的不一致,往往初学者比较容易犯这样的毛病,比如,在类的头文件

Point.h里声明了void setX(int aX);函数,在Point.cpp文件中写该函数的定义时确写成了void Point::setx(int aX){},由于C++语言是区分大小写的

编程语言,所以在编译时认定为只有该函数setX的声明,没有其定义,当然这种情况往往容易发现错误,因为计算机会先报语法声明错误,告知setx函数

没有在类Point中声明,然而,可怕的是在.h文件里声明了setX函数,却忘记了在.cpp文件里定义,这时,在程序中调用过几次setX函数就会出现几个

link链接错误,初学者往往由于大量的链接错误而灰心丧气,其实如果知道原因了修改起来并不难。
        避错方案:将声明好的类写好后,复制,然后粘贴到.cpp文件中完成其定义过程,需要提醒的是,注意去掉每个函数声明后面的分号。

        原因二:未引入链接库.lib文件,这个多发生在使用第三方开发库的情况下,比如,我在博客中系列提到的SDL开发,开发时需要在编译的时候

链接SDL提供的lib库,如果没有通过配置的方式(配置的方法请参考我前面SDL配置相关文章,这里不做赘述)添加相关.lib文件或者通过#pragma

comment(lib, "SDL.lib")提供lib的链接,那么计算机会因为找不到所调用函数的代码段(这种情况下,只有头文件,代码段被编译好了放在.lib文件里

)而报link错误,改正的方法就不言而喻了。
       避错方案:先看自己的工程有没有用到第三方开发环境,如果用到了,请先把这些配好,再开始后续的开发工作。另外,不是只有第三方开发环

境才需要配置相应的.lib文件,当我们在VS2005/2008(暂且以他们为例,其它同理)中,按alt+F7打开工程属性页后,点选配置属性-->链接器-->输入,

可以看到默认添加好的lib文件如下:
kernel32.lib
user32.lib
gdi32.lib
winspool.lib
comdlg32.lib
advapi32.lib
shell32.lib
ole32.lib
oleaut32.lib
uuid.lib
odbc32.lib
odbccp32.lib

在开发过程中如果用到之外的库(这种情况在学习C++时很少遇到)就必须要手动添加了。

        原因三:没有将项目需要的头文件、源文件都加入项目中。这个经常会有人犯,可以进行排查。
        避错方案:细心,另外就是在写程序时发现自己用到了新的类型就立刻把该类型的头文件添加(其实就是#include进来),如果写完某对象在其

后加“.”后IDE环境不能智能弹出数据成员和成员函数,那么也要注意了,一般是因为你没有添加相应的头文件造成的。当然IDE环境出问题的情况也有

,毕竟很少,区别对待即可。

        原因四:当__declspec(dllexport)函数与inline函数混用并要生成.exe的工程也会偶然产生这种错误,这种错误我在最近做实验的时候遇到,

目前具体原因不详,在新的工程中做写简单代码测试后也没有再产生link错误,最后解决的办法是去掉了inline(本身这个是建议性的语法,所以去掉后

不影响编译),结果问题就解决了,也顺利通过了。
       避错方案:在写exe工程时,不要写__declspec(dllexport)符号,本身这个符号是编译dll时使用的导出符号,符号用的多了难免冲突,在不明原

因的情况下也很难排错。

       以上就是我目前看到的这方面的问题,如果你发现还有其它情况产生link错误,请回复我,我会整理上去,并著名您的相关信息,绝不会无端剽

窃,还请大家集思广益,给众多初学者一个良好的避风港湾。
下面我把代码粘贴一下,大神路过帮忙瞧瞧
SeqList.h中
  1. #include <stdio.h>
  2. //默认的顺序表大小
  3. const int defaultsize= 10;
  4. //类
  5. template<typename DateType>
  6. class SeqList
  7. {
  8. public:
  9.         SeqList(int size = defaultsize)
  10.         {
  11.                 //判断对应的顺序表长度
  12.                 if (size > 0)
  13.                 {
  14.                         maxSize = size;
  15.                         //数据数组
  16.                         eml = new DateType[size];
  17.                 }
  18.         }
  19.         //析构函数
  20.         ~SeqList()
  21.         {
  22.                 //申请的数组不为空时进行释放
  23.                 if (eml != NULL)
  24.                 {
  25.                         delete []eml;
  26.                         eml = NULL;
  27.                 }
  28.         }
  29.         int getLength()
  30.         {
  31.                 return curLength;
  32.         }
  33.         //插入
  34.         bool insertElem(DateType e);
  35.         //删除
  36.         bool delElem(int index);
  37.         //查找
  38.         DateType findElem(int index);
  39.         //更改
  40.         bool changeElem(int index, DateType e);
  41. private:
  42.         DateType *eml;
  43.         int maxSize;
  44.         int curLength;
  45. };
复制代码

SeqList.cpp
  1. #include "SeqList.h"
  2. #include<iostream>
  3. #include<stdio.h>
  4. //插入
  5. template<class DateType>
  6. bool SeqList<DateType>::insertElem(DateType e)
  7. {
  8.         if (curLength < maxSize)
  9.         {
  10.                 elm[curLength] = e;
  11.                 curLength++;
  12.                 return true;
  13.         }
  14.         std::cout << "insertElem function the Array is full" << std :: endl;
  15.         return false;
  16. }
  17. //删除
  18. template<class DateType>
  19. bool SeqList<DateType>::delElem(int index)
  20. {
  21.         if (curLength < index && index>=0)
  22.         {
  23.                 for (int i = index; i < curLength;i++)
  24.                 {
  25.                         elm[i] = elm[i + 1];
  26.                 }
  27.                 curLength--;
  28.                 return true;
  29.         }
  30.         std::cout << "delElem function wrong index" << std::endl;
  31.         return false;
  32.        
  33. }

  34. //查找
  35. template<class DateType>
  36. DateType SeqList<DateType>::findElem(int index)
  37. {
  38.         if (index < 0&& index>=curLength)
  39.         {
  40.                 std::cout << "findElem function wrong index" << std::endl;
  41.                 return NULL;
  42.         }
  43.         return elm[index];
  44. }
  45. //更改
  46. template<class DateType>
  47. bool SeqList<DateType>::changeElem(int index, DateType e)
  48. {
  49.         if (index >= 0 && index < curLength)
  50.         {
  51.                 eml[index] = e;
  52.                 return true;
  53.         }
  54.         std::cout << "changElem function wrong index" << std::endl;
  55.         return false;
  56. }
复制代码

测试test.c
  1. #include "SeqList.h"
  2. #include <iostream>
  3. int main()
  4. {
  5.         //使用泛型类,并调用构造函数
  6.         SeqList<int> list(10);
  7.         //插入值
  8.         for (int i = 0; i < 10; i++)
  9.         {
  10.                 list.insertElem(i);
  11.         }
  12.         //显示值
  13.         for (int i = 0; i < list.getLength(); i++)
  14.         {
  15.                 std::cout << list.findElem(i) << std::endl;
  16.         }
  17.         //更改值
  18.         list.changeElem(3, 5);
  19.         list.delElem(4);
  20.         //显示值
  21.         for (int i = 0; i < list.getLength(); i++)
  22.         {
  23.                 std::cout << list.findElem(i) << std::endl;
  24.         }

  25. }
复制代码

但是还是出现了错误
day8_30_test.obj : error LNK2019: 无法解析的外部符号 "public: bool __thiscall SeqList<int>::insertElem(int)" (?insertElem@?$SeqList@H@@QAE_NH@Z),该符号在函数 _main 中被引用
1>day8_30_test.obj : error LNK2019: 无法解析的外部符号 "public: bool __thiscall SeqList<int>::delElem(int)" (?delElem@?$SeqList@H@@QAE_NH@Z),该符号在函数 _main 中被引用
1>day8_30_test.obj : error LNK2019: 无法解析的外部符号 "public: int __thiscall SeqList<int>::findElem(int)" (?findElem@?$SeqList@H@@QAEHH@Z),该符号在函数 _main 中被引用
1>day8_30_test.obj : error LNK2019: 无法解析的外部符号 "public: bool __thiscall SeqList<int>::changeElem(int,int)" (?changeElem@?$SeqList@H@@QAE_NHH@Z),该符号在函数 _main 中被引用
1>I:\Algorithm\C\Algorithm_Practice\Debug\Algorithm_Practice.exe : fatal error LNK1120: 4 个无法解析的外部命令





上一篇:编程遇到有关类和内存占用的一个问题
下一篇:能否将某一个右斜二叉树的子树进行左旋,然后再遍历整个二叉树?
51_avatar_middle
online_admins 发表于 2015-8-31 21:44:54 | 显示全部楼层
针对模板类的做法是声明和定义必须放到一个 h 文件中,你现在是分开来写当然不行了
56_avatar_middle
ico_lz  楼主| 发表于 2015-8-31 23:06:21 | 显示全部楼层
Syc 发表于 2015-8-31 21:44
针对模板类的做法是声明和定义必须放到一个 h 文件中,你现在是分开来写当然不行了

谢谢syc大哥!
56_avatar_middle
ico_lz  楼主| 发表于 2015-9-1 07:59:06 | 显示全部楼层
Syc 发表于 2015-8-31 21:44
针对模板类的做法是声明和定义必须放到一个 h 文件中,你现在是分开来写当然不行了

已解决,谢谢syc大哥!
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-5-24 14:08

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表