在MS2010下直接编译PCL程序可能遇到的LINK ERROR

本文介绍如何在Visual Studio 2010中通过添加库路径的方式编译PCL教程程序pairwise_incremental_registration,并提供了配置过程及解决常见编译错误的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        一直想根据官方的Tutorial学习PCL,想跳过CMake文件,直接用MS2010用添加库添加路径的方式进行编译。

        现在通过Tutorial中一个较复杂的点云配准的程序 pairwise_incremental_registration 来总结一下配置过程和可能遇到的ERROR解决方案。思路是把常用的路径设成环境变量,这样以后添加路径时就可直接用$(路径名)来调用。

        设置PCL相关环境变量详情参考下面的博客:  http://blog.youkuaiyun.com/opensource07/article/details/7722569

1.   新建VS空项目,添加源文件pairwise_incremental_registration.cpp

2.   添加包含目录   

       右键项目》属性》配置属性》C/C++》常规》附加包含目录

  • $(PCL_INCLUDE_DIR)
  • $(PCL_BOOST)
  • $(PCL_EIGEN)
  • $(PCL_FLANN)
  • $(PCL_VTK)     

3.   添加库目录

       右键项目》属性》配置属性》链接器》常规》附加库目录

  • $(PCL_LIB_DIR)
  • D:\Program Files\Boost\lib     (因报ERROR某Boost相关库找不到而填加)
  • D:\Program Files\VTK 5.8.0\lib\vtk-5.8

4.   添加附加依赖库

       右键项目》属性》配置属性》链接器》输入》附加依赖库

  • pcl_io_debug.lib
  • pcl_registration_debug.lib
  • pcl_filters_debug.lib
  • pcl_visualization_debug.lib
  • pcl_common_debug.lib
  • pcl_search_debug.lib
  • pcl_kdtree_debug.lib
  • pcl_stereo_debug.lib
  • vtkRendering-gd.lib
  • vtkGraphics-gd.lib
  • vtkverdict-gd.lib
  • vtkImaging-gd.lib
  • vtkIO-gd.lib
  • vtkFiltering-gd.lib
  • vtkCommon-gd.lib
  • vtkDICOMParser-gd.lib
  • vtkNetCDF-gd.lib
  • vtkmetaio-gd.lib
  • vtksqlite-gd.lib
  • vtktiff-gd.lib
  • vtkpng-gd.lib
  • vtkjpeg-gd.lib
  • vtkexpat-gd.lib
  • vtkzlib-gd.lib
  • vtksys-gd.lib
  • opengl32.lib
  • pcl_features_debug.lib
5.   编译成功,运行时打开cmd,运行前先把PCL编译好的基本模块的动态链接库dll文件拷到项目Debug目录下,按Tutorial所说下载data, 转到应用程序目录下运行程序。


编译过程中可能遇到的连接错误:

1.  ERROR LINK1223:转换到COFF期间失败

      解决方案:右键项目》属性》配置属性》清单工具》输入和输出》潜入清单, “是”改为“否”。

      或 安装VS2010 Service Pack 1 永久解决。

2.   ERROR LINK2019:无法解析的外部符号

      问题原因:使用了某一个外部函数,或者只有函数声明,没有函数定义。这个错误主要都是和vtk相关的。
                        如果用到了外部函数,即使源程序中已经写明了包含kernel32.lib,也要在链接的时候写入链接程序。解决办法就是在编译选项中加入问题函数所在的lib文件即可。所以这里即使已经添加了VTK的库目录,也要在附加链接库里加上有关vtk的库。

      解决方案:搜索 “vtk VS2010配置”,找到配置攻略里附加依赖库那一块一般加什么库。可以都加上。

vtkRendering.lib vtkGraphics.lib vtkverdict.libvtkImaging.lib vtkIO.lib vtkFiltering.lib vtkCommon.lib  vtkDICOMParser.libvtkNetCDF.lib vtkmetaio.lib comctl32.lib wsock32.lib vtksqlite.lib vtkpng.libvtktiff.lib vtkzlib.lib vtkjpeg.lib vtkexpat.lib vtksys.lib ws2_32.libvfw32.lib vtkftgl.lib vtkfreetype.lib opengl32.lib vtkWidgets.libvtkVolumeRendering.lib  vtkViews.libvtkproj4.lib vtklibxml2.lib vtkInfovis.lib vtkHybrid.lib vtkGeovis.libvtkGenericFiltering.lib vtkexoIIc.lib vtkCharts.lib vtkalglib.lib

3.  ERROR LINK2038:检测到 “_ITERATOR_DEBUG_LEVEL" 的不匹配项:值 ”0“ 不匹配值 ”2“ 

      问题原因:可能是Debug下面引用了release下面编译出来的静态库。

      解决方案:vtk库目录下每个lib相应的都有-gd.lib, 于是把所有的都换成-gd.lib。


PCL教程程序编译过程比较典型的链接错误就是上面几种了,欢迎批评指正。

<think>好的,用户现在的问题是关于在Ubuntu系统上编译PCL 1.8.1的pcl_surface模块时遇到的错误。用户之前已经提供了一些引用的资料,我需要结合这些资料和之前的回答来给出解决方案。 首先,用户提到之前的回答中提到了CMakeFiles/Makefile2:2113的错误,这可能涉及依赖项缺失或配置问题。现在用户想具体解决在Ubuntu上编译pcl_surface的问题,需要参考用户提供的引用[1]、[2]、[3]、[4]。 引用[1]和[2]提到Ubuntu 18.04默认安装的PCL是1.8版本,但可能需要源码编译python-pcl,因为pip安装可能会有动态链接库的问题。这可能暗示用户的环境可能存在依赖库版本不匹配的问题,尤其是Boost和VTK。引用[3]提到了安装VTK和PCL时需要Qt支持,这可能涉及到VTK的配置是否正确。引用[4]给出了环境变量的设置,比如LD_LIBRARY_PATH和CPLUS_INCLUDE_PATH,这可能与Boost库的路径有关。 在之前的回答中,已经提到过Boost链接失败、C++11标准、FLANN冲突等问题。现在需要将这些与用户提供的引用结合起来,看看是否有遗漏的点。比如,用户是否安装了正确版本的VTK?在引用[1]中,修改setup.py时指定了VTK的版本为7.0,这可能意味着PCL 1.8需要VTK 7.0或7.1的支持,而如果系统中安装的是VTK 8.0,可能会导致不兼容。另外,引用[3]中的指南提到安装VTK 8.1.0,但用户用的是PCL 1.8.1,可能存在版本冲突。 此外,用户的问题可能还涉及到环境变量是否正确设置,如Boost库的路径是否被正确导出(引用[4])。在编译时,如果Boost库的路径没有被正确识别,会导致链接错误,如-lboost_system找不到。 可能的步骤包括: 1. 确认Boost版本和安装路径,设置环境变量。 2. 检查VTK版本是否为7.x,与PCL 1.8.1兼容。 3. 确保CMake配置中正确指定了Boost和VTK的路径。 4. 检查是否有头文件包含顺序问题,导致类型定义冲突。 5. 清理构建目录并重新配置编译,确保所有依赖项被正确识别。 另外,用户提供的引用[2]提到源码编译python-pcl,但用户当前的问题是关于PCL本身的编译,所以可能需要排除python-pcl的影响,专注于PCL编译过程。 需要提醒用户检查具体的错误日志,使用grep等工具分析日志中的具体错误信息,如undefined reference或fatal error,以定位问题根源。例如,如果是Boost库的问题,可能需要重新安装或指定Boost的路径;如果是VTK版本问题,可能需要安装正确的版本或调整CMake配置。 总结来说,解决方案应涵盖依赖库版本检查、环境变量设置、CMake配置调整以及编译步骤优化,确保所有依赖项正确链接,并处理可能出现的ABI兼容性或头文件冲突。</think>### 分步解决方案(针对Ubuntu系统编译PCL 1.8.1的`pcl_surface`模块报错) --- #### 一、核心问题定位 根据引用[1][2][3]的实践经验和错误特征,`pcl_surface`编译失败通常由以下原因导致: 1. **Boost库版本不匹配**(需1.65+,但系统默认可能为1.58) 2. **VTK头文件路径未正确配置**(需VTK 7.x而非8.x) 3. **C++11标准未强制启用**(导致ABI兼容性问题) 4. **FLANN动态库符号冲突**(常见于多版本共存) --- #### 二、关键修复步骤 ##### 1. **Boost库环境配置(引用[4])** ```bash # 安装Boost 1.65(必须源码编译) wget https://sourceforge.net/projects/boost/files/boost/1.65.0/boost_1_65_0.tar.gz tar -xzvf boost_1_65_0.tar.gz cd boost_1_65_0 ./bootstrap.sh --prefix=/usr/local/boost_1_65_0 ./b2 install # 设置环境变量(引用[4]) export LD_LIBRARY_PATH=/usr/local/boost_1_65_0/lib:$LD_LIBRARY_PATH export CPLUS_INCLUDE_PATH=/usr/local/boost_1_65_0/include:$CPLUS_INCLUDE_PATH ``` ##### 2. **VTK版本修正(引用[1][3])** ```bash # 卸载冲突的VTK版本 sudo apt purge libvtk7-dev libvtk6-dev # 安装VTK 7.1.1(源码编译) wget https://www.vtk.org/files/release/7.1/VTK-7.1.1.tar.gz tar -xzvf VTK-7.1.1.tar.gz cd VTK-7.1.1 mkdir build && cd build cmake -DCMAKE_INSTALL_PREFIX=/usr/local/vtk-7.1.1 .. make -j$(nproc) sudo make install # 配置环境变量 export VTK_DIR=/usr/local/vtk-7.1.1/lib/cmake/vtk-7.1 ``` ##### 3. **CMake配置修正** 在PCL源码目录的`CMakeLists.txt`中添加以下配置: ```cmake # 强制启用C++11(解决ABI问题) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 显式指定Boost和VTK路径(引用[3]) set(BOOST_ROOT /usr/local/boost_1_65_0) set(VTK_DIR /usr/local/vtk-7.1.1/lib/cmake/vtk-7.1) # 添加surface模块特殊依赖 find_package(Boost 1.65.0 REQUIRED COMPONENTS system filesystem thread) find_package(VTK 7.1 REQUIRED) target_link_libraries(pcl_surface ${Boost_LIBRARIES} ${VTK_LIBRARIES} ) ``` ##### 4. **头文件冲突修复(引用[1])** 在`surface`模块的源文件(如`src/concave_hull.cpp`)开头添加: ```cpp #include <pcl/pcl_macros.h> // 必须在所有第三方库头文件之前包含 #include <boost/...> // 原Boost头文件 ``` --- #### 三、编译流程优化 ```bash # 完全清理构建环境 rm -rf build && mkdir build && cd build # 带诊断的CMake配置 cmake -DCMAKE_BUILD_TYPE=Release \ -DBOOST_ROOT=/usr/local/boost_1_65_0 \ -DVTK_DIR=/usr/local/vtk-7.1.1/lib/cmake/vtk-7.1 \ -DFLANN_ROOT=/usr/local/flann-1.9.4 \ -DCMAKE_VERBOSE_MAKEFILE=ON .. # 仅编译surface模块(缩小范围) make -j$(nproc) pcl_surface 2>&1 | tee surface.log ``` --- #### 四、错误排查表 | 错误类型 | 检测方法 | 解决方案 | |---------------------------|---------------------------------------|--------------------------------------------------------------------------| | **Boost符号未定义** | `grep "undefined reference" surface.log` | 检查`BOOST_ROOT`路径,确认`libboost_system.so.1.65.0`存在[^4] | | **VTK头文件缺失** | `grep "vtkPolyData.h" surface.log` | 验证`VTK_DIR`是否指向7.1版本的CMake配置目录[^1] | | **C++11特性未启用** | `grep "-std=c++" surface.log` | 强制设置`CMAKE_CXX_STANDARD=11`[^3] | | **FLANN版本冲突** | `ldd libpcl_surface.so \| grep flann` | 重新编译FLANN 1.9.4并更新`FLANN_ROOT`路径[^2] | --- ### 相关问题扩展 1. **如何验证VTK与PCL的版本兼容性?** 运行`pcl-config --version`查看PCL版本,并通过`vtkVersionMacros.h`检查VTK主版本是否为7.x[^1] 2. **如何避免多个Boost版本冲突?** 使用`update-alternatives`管理Boost版本: ```bash sudo update-alternatives --install /usr/lib/libboost_system.so libboost_system.so /usr/local/boost_1_65_0/lib/libboost_system.so.1.65.0 100 ``` 3. **为什么必须源码编译Python-PCL?** Ubuntu的预编译可能依赖`libpcl_*.so.1.7`,而源码安装的PCL 1.8.1生成的是`libpcl_*.so.1.8`,需通过源码编译绑定[^2] --- [^1]: Ubuntu环境下VTK与PCL版本匹配规则 [^2]: Python-PCL源码编译依赖分析 [^3]: PCL官方编译指南 [^4]: Boost库环境配置实践
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值