ubuntu中有不同版本的pcl时的使用策略
在你的系统中存在两个不同版本的 PCL (Point Cloud Library):
- pcl-1.10 安装在
/usr/include/pcl-1.10
(系统级安装) - 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.10
g++ -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
建议
- 如果项目没有特殊要求,建议使用更新的 pcl-1.14
- 如果出现兼容性问题,可以通过 CMake 或编译标志明确指定版本
- 长期建议统一版本,可以通过包管理器移除不需要的版本
两个版本共存本身不会导致问题,但混合使用不同版本的头文件和库可能会导致运行时错误。
冲突
然后我在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