系统环境
- ubuntu 22.04
- pcl 1.12.1
- flann 1.9.2
- ros2 humble
1 报错
引用kdtree/flann.h的时候容易出现这个问题,报错内容如下:
1)undefined reference to LZ4_resetStreamHC
2)undefined reference to LZ4_compress_HC_continue
3)undefined reference to LZ4_decompress_safe
4)undefined reference to LZ4_setStreamDecode
2 解决办法
强调:如果已经成功安装pcl,只是执行ros2 编译代码命令
colcon build
报错,看步骤2.4
--------------------------------------------2023.12.16更新--------------------------------------------------------
更新原因:在[步骤2.4
]中CMakeLists.txt文件中的ament_target_dependencies
添加了PUBLIC
, 这是从ROS 1 移植代码时复制过来的,并不知道什么意思,同时会导致错误:vtkSmartPointer.h: 没有那个文件或目录
。 因此删除掉PUBLIC
,不需要添加[步骤2.4
]的内容,也可以解决报错。
#删除前
ament_target_dependencies(random_forest
PUBLIC
pcl_conversions
geometry_msgs
nav_msgs
sensor_msgs
rclcpp
std_msgs
PCL
)
#删除后
ament_target_dependencies(random_forest
pcl_conversions
geometry_msgs
nav_msgs
sensor_msgs
rclcpp
std_msgs
PCL
)
2.1 通过源码安装PCL [1]
如果已经是源码安装,则跳过。(本人通过命令sudo apt-get installl libpcl-dev
安装pcl,则没有相应的link.txt文件)。我下载的pcl 1.12.1版本(ubuntu22.04),下载链接https://github.com/PointCloudLibrary/pcl。按照安装步骤,执行:
cd pcl
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=None -DCMAKE_INSTALL_PREFIX=/usr\
-DCMAKE_GPU=ON -DBUILD_apps=ON -DBUILD_examples=ON \
-DCMAKE_INSTALL_PREFIX=/usr ..
(这里没有执行安装命令:make
和sudo make install
)
2.2 修改link.txt
找到/pcl/build/kdtree/CMakeFiles/pcl_kdtree.dir/link.txt文件,在打开后txt文件末尾写上:-llz4
,参考 这里。(备注:实际上我的txt文件末尾已经自带 -llz4,因此最终通过步骤2.4解决)
此外,通过命令找到liblz4.so路径
sudo find / -name liblz4.so
参照 方法 ,将 /usr/lib/x86_64-linux-gnu/liblz4.so也加入link.txt文件
2.3 最终在终端上运行:
make
sudo make install
2.4 添加liblz4.so依赖(针对ros2编译,很重要)
如果执行玩步骤2.1~2.3以后,仍然报错,解决方式如下:在 工作空间/src/包名/CMakeLists.txt
文件里面添加如下代码:
find_library(LZ4_LIBRARIES NAMES liblz4.so HINTS "lz4/lib")
link_libraries(${LZ4_LIBRARIES})
add_definitions(${LZ4_DEFINITIONS})
参考这里方法截图
3 其他方法(无效/无法确认/不懂怎么修改)
(1) 修改flann 的CMakeLists.txt文件,并重新编译,链接1;
(2) 修改flann 的CMakeLists.txt文件,并重新编译,链接2