今天在使用nabo库的时候碰到一个问题,如下:
/home/jinye/projects/Segment/SegmatchProject/Default/libsegmatch.so👎 error: undefined reference to `Nabo::NearestNeighbourSearch<float, Eigen::Matrix<float, -1, -1, 0, -1, -1> >::knn(Eigen::Matrix<float, -1, 1, 0, -1, 1> const&, Eigen::Matrix<int, -1, 1, 0, -1, 1>&, Eigen::Matrix<float, -1, 1, 0, -1, 1>&, int, float, unsigned int, float) const’
看来是链接的时候找不到nabo相关函数的实现
1. 问题分析:
1.1. 查找nabo的配置文件
在CMakeList.txt中通过find_package
查找nabo的配置文件
find_package(libnabo)
message(STATUS "libnabo_DIR = ${libnabo_DIR}")
message(STATUS "libnabo_INCLUDE_DIRS = ${libnabo_INCLUDE_DIRS}")
message(STATUS "libnabo_LIBRARIES = ${libnabo_LIBRARIES}")
输出信息为:
-- libnabo_DIR = /usr/local/share/libnabo/cmake
-- libnabo_INCLUDE_DIRS =
-- libnabo_LIBRARIES =
可以看到,其实是找到了nabo的配置文件路径了,可能是配置文件的信息有误,导致找不到头文件和库文件的位置
1.2. 查看配置文件
打开linnaboConfig.cmake
# - Config file for the libnabo package
include(${CMAKE_CURRENT_LIST_DIR}/libnabo-targets.cmake)
# This causes catkin_simple to link against these libraries
set(libnabo_FOUND_CATKIN_PROJECT true)
发现它引用了libnabo-targets.cmake这个配置文件,继续查找,
搜索libnabo_INCLUDE_DIRS
,libnabo_INCLUDE_DIRS
,可以看到这两个变量并没有被设置,所以cmake才找不到nabo的头文件和库文件
2. 解决方案
这里我选择自己设置头文件和库文件的位置
set(libnabo_INCLUDE_DIRS "/usr/local/include/nabo")
set(libnabo_LIBRARIES "/usr/local/lib/libnabo.so")