vs报错“错误 LNK2019 无法解析的外部符号”的几种原因及解决方案

  运行vs程序的时候,报错严重性 代码 说明 项目 文件 行 禁止显示状态 错误 LNK2019 无法解析的外部符号 "__declspec(dllimport) public: void __cdecl PointCloudFilter::setptClouds(struct LAS_POINT *)" (__imp_?setptClouds@PointCloudFilter@@QEAAXPEAULAS_POINT@@@Z),该符号在函数 "private: void __cdecl PointCloudFilters::doAction(void)" (?doAction@PointCloudFilters@@AEAAXXZ) 中被引用,如下图所示:
vs报错“错误 LNK2019 无法解析的外部符号”的几种原因及解决方案_第1张图片
  报这个错误一般是因为使用了一些未定义或者没找到定义的函数或者变量等等。解决的方法通常有以下几种:

  1. 如果是在写代码阶段就报错了(当然如果是这种情况,报错的内容也就不是这样的了,这里只是顺便提一下),那一般是因为包含目录没有设置对,导致程序无法找到外部库的函数定义;而如果是自定义的函数找不到,则需要检查一下函数的拼写是否正确,或者函数在cpp中实现时有没有在函数名前面加上类的定义域(即类名::)。
  2. 如果是运行时报错,常见的原因是你引用了某个库的函数,然后也正确添加了它的头文件路径,vs在写代码阶段可以找到这个函数的定义,但是,由于你没有添加或者正确设置这个库的lib或者dll路径的话,那么vs就会在运行时候报错无法解析的外部符号。库目录(lib文件目录)是在项目->属性->配置属性->VC++目录->库目录里进行添加,如下图所示:
    vs报错“错误 LNK2019 无法解析的外部符号”的几种原因及解决方案_第2张图片
  3. 前两种情况是一般的情况,但是如果不是前两种情况的话,那就有可能和宏定义有关了,这也是这篇博客主要想说明的情况。从一开始贴上来的报错信息中可以看出,错误出现在PointCloudFilter类这里。于是,我们打开这个类的头文件,可以在开头的地方发现几行预处理代码,如下图所示。这是一个if_else的语句,大致意思是,如果定义了DLL_IMPLEMENT,则将DLL_API这个宏的值设置为输出dll文件,否则设置为输入dll文件。而这里,这个工程是要输出dll文件的,因此,我们需要在这些代码运行之前先定义好DLL_IMPLEMENT
    vs报错“错误 LNK2019 无法解析的外部符号”的几种原因及解决方案_第3张图片
      解决办法就是,打开项目->属性->配置属性->C/C++->预处理器,然后在预处理器栏目这里加上DLL_IMPLEMENT这个宏,如下图所示。确认保存后,再运行程序,就不会报错了。
    vs报错“错误 LNK2019 无法解析的外部符号”的几种原因及解决方案_第4张图片
  4. 最后还提一个非常隐蔽且常常被人忽视的情况。那就是你需要确认一下你在属性页的程序配置平台和实际运行的配置平台是一致的,如下图所示:
    vs报错“错误 LNK2019 无法解析的外部符号”的几种原因及解决方案_第5张图片
  5. 其他一些特殊问题的解决方案:一个解决方案中包含多个项目且它们之间存在相互引用的情况,opencv imwrite所需的引用,cloudcompare无法找到ccDefaultPluginInterface类。
  6. 补充一点来自评论区的隐秘的错误:检查一下你的main函数名字拼的对不对,可别写成了mian。

你可能感兴趣的:(vs,debug,c++,visual,studio,debug)