You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编译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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 08:57:35