> 技术文档 > ubuntu中有不同版本的pcl时的使用策略

ubuntu中有不同版本的pcl时的使用策略

在你的系统中存在两个不同版本的 PCL (Point Cloud Library):

  1. pcl-1.10 安装在 /usr/include/pcl-1.10(系统级安装)
  2. pcl-1.14 安装在 /usr/local/include/pcl-1.14(本地安装)

当编译时具体使用哪个版本,取决于以下几个因素:

1. 编译器查找顺序

编译器通常会按照以下顺序查找头文件:

  • 首先检查 -I 指定的路径
  • 然后检查 /usr/local/include
  • 最后检查 /usr/include

2. 链接器查找顺序

对于库文件(.so/.a),类似的顺序适用于 -L 指定的路径。

3. 最可能的情况

由于 /usr/local/include 优先级高于 /usr/include默认情况下编译器会使用 pcl-1.14

如何明确指定版本?

如果你想明确控制版本,可以通过以下方式:

CMake 项目:
find_package(PCL 1.14 REQUIRED) # 明确指定版本include_directories(${PCL_INCLUDE_DIRS})target_link_libraries(your_target ${PCL_LIBRARIES})
手动编译时:
# 使用 pcl-1.14用g++ -I/usr/local/include/pcl-1.14 -L/usr/local/lib -lpcl_common ...# 使用 pcl-1.10g++ -I/usr/include/pcl-1.10 -L/usr/lib -lpcl_common ...

检查当前使用的版本

# 查看链接的库ldd your_executable | grep pcl# 查看编译时的包含路径g++ -v your_file.cpp 2>&1 | grep pcl

建议

  1. 如果项目没有特殊要求,建议使用更新的 pcl-1.14
  2. 如果出现兼容性问题,可以通过 CMake 或编译标志明确指定版本
  3. 长期建议统一版本,可以通过包管理器移除不需要的版本

两个版本共存本身不会导致问题,但混合使用不同版本的头文件和库可能会导致运行时错误。

冲突

然后我在ros包使用pcl的时候,其实就遇到了这样的问题:

/usr/bin/ld: warning: libpcl_filters.so.1.14, needed by /usr/local/lib/libpcl_segmentation.so, may conflict with libpcl_filters.so.1.10/usr/bin/ld: warning: libpcl_common.so.1.14, needed by /usr/local/lib/libpcl_segmentation.so, may conflict with libpcl_common.so.1.10[100%] Built target fastlio_mapping_localization/usr/bin/ld: warning: libpcl_filters.so.1.14, needed by /usr/local/lib/libpcl_segmentation.so, may conflict with libpcl_filters.so.1.10/usr/bin/ld: warning: libpcl_common.so.1.14, needed by /usr/local/lib/libpcl_segmentation.so, may conflict with libpcl_common.so.1.10

解决方案