编译g2o示例程序时make提示无法找到链接库问题求助
问题
我克隆了g2o仓库,在其build目录执行以下命令完成编译安装:
g2o/build$ cmake .. g2o/build$ make g2o/build$ make install
之后尝试运行simple optimizer示例程序,修改了其CMakeLists.txt为如下内容:
include(CheckCXXCompilerFlag) CHECK_CXX_COMPILER_FLAG("-std=c++17" COMPILER_SUPPORTS_CXX17) CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11) CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X) if(COMPILER_SUPPORTS_CXX17) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17") add_definitions(-DCOMPILEDWITHC17) message(STATUS "Using flag -std=c++17.") elseif(COMPILER_SUPPORTS_CXX11) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") add_definitions(-DCOMPILEDWITHC11) message(STATUS "Using flag -std=c++11.") elseif(COMPILER_SUPPORTS_CXX0X) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x") add_definitions(-DCOMPILEDWITHC0X) message(STATUS "Using flag -std=c++0x.") else() message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.") endif() find_package(g2o REQUIRED) include_directories(${G2O_INCLUDE_DIRS}) find_package(Eigen3 3.1.0 REQUIRED) include_directories(${EIGEN3_INCLUDE_DIR}) link_directories(/ws/gps-imu-calib/g2o/build/lib) add_executable(simple_optimize simple_optimize.cpp ) set_target_properties(simple_optimize PROPERTIES OUTPUT_NAME simple_optimize) target_link_libraries(simple_optimize core solver_eigen ${EIGEN3_LIBS} ${G2O_CORE_LIBRARY}) target_link_libraries(simple_optimize types_slam2d) target_link_libraries(simple_optimize types_slam3d)
在simple_optimize目录下创建build文件夹,执行cmake成功,但make时出现错误:
Scanning dependencies of target simple_optimize [ 50%] Building CXX object CMakeFiles/simple_optimize.dir/simple_optimize.o [100%] Linking CXX executable simple_optimize /usr/bin/ld: cannot find -lcore /usr/bin/ld: cannot find -lsolver_eigen /usr/bin/ld: cannot find -ltypes_slam2d /usr/bin/ld: cannot find -ltypes_slam3d collect2: error: ld returned 1 exit status make[2]: *** [CMakeFiles/simple_optimize.dir/build.make:84: simple_optimize] Error 1 make[1]: *** [CMakeFiles/Makefile2:76: CMakeFiles/simple_optimize.dir/all] Error 2 make: *** [Makefile:84: all] Error 2
请问遗漏了什么?
解决方法
问题核心是库名称写法错误,且未正确利用g2o提供的CMake变量。g2o编译生成的库均带有g2o_前缀,比如你写的core实际应为g2o_core,solver_eigen实际是g2o_solver_eigen,以此类推。
另外,通过find_package(g2o REQUIRED)已完成g2o的查找,无需手动添加link_directories,直接使用g2o导出的目标变量更可靠。
修正后的CMakeLists.txt(推荐写法)
include(CheckCXXCompilerFlag) CHECK_CXX_COMPILER_FLAG("-std=c++17" COMPILER_SUPPORTS_CXX17) CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11) CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X) if(COMPILER_SUPPORTS_CXX17) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17") add_definitions(-DCOMPILEDWITHC17) message(STATUS "Using flag -std=c++17.") elseif(COMPILER_SUPPORTS_CXX11) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") add_definitions(-DCOMPILEDWITHC11) message(STATUS "Using flag -std=c++11.") elseif(COMPILER_SUPPORTS_CXX0X) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x") add_definitions(-DCOMPILEDWITHC0X) message(STATUS "Using flag -std=c++0x.") else() message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.") endif() find_package(g2o REQUIRED) find_package(Eigen3 3.1.0 REQUIRED) add_executable(simple_optimize simple_optimize.cpp ) set_target_properties(simple_optimize PROPERTIES OUTPUT_NAME simple_optimize) # 直接使用g2o提供的命名空间目标,CMake自动处理路径和链接 target_link_libraries(simple_optimize g2o::core g2o::solver_eigen g2o::types_slam2d g2o::types_slam3d Eigen3::Eigen )
兼容旧版本g2o的写法
如果你的g2o版本不支持g2o::xxx的目标语法,可改用带前缀的库名:
# 替换原target_link_libraries部分 target_link_libraries(simple_optimize g2o_core g2o_solver_eigen g2o_types_slam2d g2o_types_slam3d ${EIGEN3_LIBS} )
另外,make install后g2o库已安装到系统默认路径(如/usr/local/lib),手动指定的link_directories可能导致版本冲突,建议删除该行,让CMake自动查找正确的库路径。
内容的提问来源于stack exchange,提问作者MsA
相关产品推荐
相关产品推荐

