第一个问题:
Could not find a package configuration file provided by "G2O" with any of
the following names:
G2OConfig.cmake
g2o-config.cmake
找不到g2o的cmake文件。
查找系统路径,在/usr/local/lib/cmake/g2o中存在g2oConfig.cmake,打印message(STATUS "CMAKE_PREFIX_PATH = ${CMAKE_PREFIX_PATH}")发现,没有上述路径。
添加set(CMAKE_PREFIX_PATH "/usr/local" ${CMAKE_PREFIX_PATH})
再次catkin发现,依然找不到。
原因很抽象:g2o编译生成的是g2oConfig.cmake,而cmake查找的是G2OConfig.cmake
大小写不一样,在/usr/local/lib/cmake/g2o执行sudo mv g2oConfig.cmake G2OConfig.cmake
再次catkin_make,没有这个问题。
还有另一种解决方法,直接绕过cmake搜索:
set(G2O_INCLUDE_DIRS /usr/local/include/g2o)
set(G2O_LIBRARY_DIRS /usr/local/lib)
这样catkin_make也没有问题。
第二个问题:
上述问题解决后,遇到新的问题:
/usr/bin/ld: g2oCurveFitting.cpp:(.text+0x272): undefined reference to `g2o::SparseOptimizer::SparseOptimizer()'
/usr/bin/ld: g2oCurveFitting.cpp:(.text+0x28b): undefined reference to `g2o::SparseOptimizer::setAlgorithm(g2o::OptimizationAlgorithm*)'
/usr/bin/ld: g2oCurveFitting.cpp:(.text+0x29f): undefined reference to `g2o::SparseOptimizer::setVerbose(bool)'
/usr/bin/ld: g2oCurveFitting.cpp:(.text+0x3bf): undefined reference to `g2o::HyperGraph::Edge::setId(int)'
/usr/bin/ld: g2oCurveFitting.cpp:(.text+0x4cd): undefined reference to `g2o::OptimizableGraph::addEdge(g2o::OptimizableGraph::Edge*)'
/usr/bin/ld: g2oCurveFitting.cpp:(.text+0x521): undefined reference to `g2o::SparseOptimizer::initializeOptimization(int)'
/usr/bin/ld: g2oCurveFitting.cpp:(.text+0x53a): undefined reference to `g2o::SparseOptimizer::optimize(int, bool)'
/usr/bin/ld: g2oCurveFitting.cpp:(.text+0x667): undefined reference to `g2o::SparseOptimizer::~SparseOptimizer()'
/usr/bin/ld: g2oCurveFitting.cpp:(.text+0x722): undefined reference to `g2o::SparseOptimizer::~SparseOptimizer()'
原因是.so文件找不到
解决方案:
target_link_libraries(g2oCurveFitting
${catkin_LIBRARIES}
${G2O_CORE_LIBRARY}
${G2O_STUFF_LIBRARY}
${OpenCV_LIBS}
g2o_core g2o_types_slam3d g2o_solver_csparse g2o_stuff g2o_csparse_extension g2o_types_sba
)
在target_link_libraries中加上最后一行。
然后catkin_make 完全通过。
第三个问题:
rosrun optiminize g2oCurveFitting 出现错误:
error while loading shared libraries: libg2o_core.so.0.1: cannot open shared object file: No such file or directory
解决方法:
sudo gedit /etc/ld.so.conf
#指定动态链接器(ld.so 或 ld-linux.so)在运行时查找共享库(动态库,.so 文件)的额外目录路径
添加 /usr/local/lib
sudo ldconfig #重新生成动态链接器缓存,确保运行程序时能够找到正确的共享库。
再次执行,成功。