使用PCL一体化安装包与VS2017时出现链接错误求助
这种批量的LNK2019未解析外部符号错误,我配置PCL的时候也踩过好几次坑,结合你已经做了包含目录、库目录和系统路径配置的情况,大概率是几个容易忽略的细节没到位,咱们一步步排查:
确保运行库配置和PCL预编译包一致
PCL的一体化安装包是用特定的运行库编译的,1.8.1-msvc2017-win64版本默认一般是MD/MDd(多线程动态运行库)。你得检查自己项目的运行库设置:
右键项目→属性→C/C++→代码生成→运行库,Release模式选/MD,Debug模式选/MDd(如果你的PCL包是MT版本,就对应选/MT和/MTd)。运行库不匹配是这类链接错误的头号原因。严格区分Debug和Release的依赖库
PCL的Debug库都带_debug后缀(比如pcl_console_debug.lib),Release库不带后缀(比如pcl_console.lib)。别图省事把两种库混加在同一个配置里:- 切换到Debug配置,在链接器→输入→附加依赖项里,添加所有PCL及依赖库的Debug版本(包括Boost、FLANN、VTK等第三方库的Debug库);
- 切换到Release配置,换成对应的不带后缀的Release版本库。
检查是否漏加了第三方依赖库
PCL依赖一堆第三方库,比如Boost的boost_thread.lib/boost_thread-vc141-mt-gd-1.65.1.lib(Debug版)、FLANN的flann_cpp_s.lib、VTK的相关库等。你只加PCL本身的库肯定不够,得把这些依赖的库也加到附加依赖项里,同样要区分Debug/Release。确认项目平台是x64
你装的是Win64版本的PCL,项目必须设为x64平台:
右键项目→属性→配置管理器→平台,选择x64,不能是默认的x86。32位程序调用64位库必然会出现符号未解析。添加必要的预处理器定义
有时候需要手动添加PCL的预处理器定义来匹配版本:
右键项目→属性→C/C++→预处理器→预处理器定义,添加PCL_NO_PRECOMPILE和PCL_VERSION=10801(对应1.8.1版本),这能避免一些因为预编译头或版本不匹配导致的符号问题。清理缓存后重新编译
最后别忘清理项目的中间文件:删掉项目目录下的Debug/Release文件夹,右键项目→清理,再重新生成解决方案。有时候旧的缓存文件会干扰链接过程。
内容的提问来源于stack exchange,提问作者Longbow

