【问题标题】:How do i solve this"... .so: undefined reference to '..."我该如何解决这个问题“... .so: undefined reference to '...”
【发布时间】:2021-07-21 11:42:40
【问题描述】:

我已经在互联网上浏览了几个小时来处理与我类似的案例,但我已经尝试了所有解决方案,但我的代码仍然无法正常工作。我正在使用一个名为“vdo_slam”的库,该库已经构建,可以在/usr/local/include/vdo_slam 中找到。在我的项目的CMakeList.txt 中,我可以find_package(vdo_slam REQUIRED) 没有错误。我遇到的唯一问题是在“catkin_build”的末尾,我得到了几个“未定义的对 .... 的引用”,如下所示。我尝试了以下几种解决方案。所有这些未定义的引用都在“vdo_slam”包中声明和定义。任何帮助表示赞赏。

我尝试过的已知解决方案:

  1. 我查找了错误中提到的类和函数,并查看是否存在here 中提到的纯虚析构函数,但它们都已明确定义。

  2. 我尝试使用“readelf”命令进行调试,如下所示,参考this。但我没有“libvdo_slam.so”,它实际上在错误中包含这些函数。我想当我运行这个“readelf”命令时我需要有“libvdo_slam.so”,对吗?如何添加?

来自“catkin_build”的错误信息:

/home/tranks/testing_ws/devel/lib/libmy_realtime_vdo_slam.so: undefined reference to `typeinfo for VDO_SLAM::Visualizer2D'
/home/tranks/testing_ws/devel/lib/libmy_realtime_vdo_slam.so: undefined reference to `vtable for VDO_SLAM::Visualizer2D'
/home/tranks/testing_ws/devel/lib/libmy_realtime_vdo_slam.so: undefined referealtime_vdo_slam/CMakeFiles/ros_vdoslam_node.dir/all' failed
make[3]: *** [my_realtime_vdo_slam/CMakeFiles/ros_vdoslam_node.dir/all] Error 2
Makefile:140: recipe for target 'all' failed
make: *** [all] Error 2
Invoking "make -j12 -l12" failede/tranks/testing_ws/devel/lib/libmy_realtime_vdo_slam.so: undefined reference to `VDO_SLAM::BoundingBox::BoundingBox(double, double, double, double)'
/home/tranks/testing_ws/devel/lib/libmy_realtime_vdo_slam.so: undefined reference to `VDO_SLAM::Scene::Scene()'
/home/tranks/testing_ws/devel/lib/libmy_realtime_vdo_slam.so: undefined reference to `VDO_SLAM::Visualizer2D::spinOnce(std::shared_ptr<VDO_SLAM::Scene>&)'
/home/tranks/testing_ws/devel/lib/libmy_realtime_vdo_slam.so: undefined reference to `VDO_SLAM::Scene::add_scene_object(std::shared_ptr<VDO_SLAM::SceneObject>&)'
/home/tranks/testing_ws/devel/lib/libmy_realtime_vdo_slam.so: undefined reference to `VDO_SLAM::Visualizer2D::Visualizer2D(std::shared_ptr<VDO_SLAM::VisualizerParams>&)'
collect2: error: ld returned 1 exit status
my_realtime_vdo_slam/CMakeFiles/ros_vdoslam_node.dir/build.make:226: recipe for target '/home/tranks/testing_ws/devel/lib/my_realtime_vdo_slam/ros_vdoslam_node' failed
make[3]: *** [/home/tranks/testing_ws/devel/lib/my_realtime_vdo_slam/ros_vdoslam_node] Error 1
CMakeFiles/Makefile2:6593: recipe for target 'my_realtime_vdo_slam/CMakeFiles/ros_vdoslam_node.dir/all' failed
make[3]: *** [my_realtime_vdo_slam/CMakeFiles/ros_vdoslam_node.dir/all] Error 2
Makefile:140: recipe for target 'all' failed
make: *** [all] Error 2
Invoking "make -j12 -l12" failed
$ readelf --dynamic /home/tranks/testing_ws/devel/lib/libmy_realtime_vdo_slam.so

    Dynamic section at offset 0x161608 contains 42 entries:
      Tag        Type                         Name/Value
     0x0000000000000001 (NEEDED)             Shared library: [libimage_transport.so]
     0x0000000000000001 (NEEDED)             Shared library: [libcv_bridge.so]
     0x0000000000000001 (NEEDED)             Shared library: [libopencv_core.so.3.2]
     0x0000000000000001 (NEEDED)             Shared library: [libtf2_ros.so]
     0x0000000000000001 (NEEDED)             Shared library: [libtf2.so]
     0x0000000000000001 (NEEDED)             Shared library: [libroscpp.so]
     0x0000000000000001 (NEEDED)             Shared library: [libroscpp_serialization.so]
     0x0000000000000001 (NEEDED)             Shared library: [librosconsole.so]
     0x0000000000000001 (NEEDED)             Shared library: [librostime.so]
     0x0000000000000001 (NEEDED)             Shared library: [libboost_system.so.1.65.1]
     0x0000000000000001 (NEEDED)             Shared library: [libpthread.so.0]
     0x0000000000000001 (NEEDED)             Shared library: [libopencv_highgui.so.3.4]
     0x0000000000000001 (NEEDED)             Shared library: [libstdc++.so.6]
     0x0000000000000001 (NEEDED)             Shared library: [libm.so.6]
     0x0000000000000001 (NEEDED)             Shared library: [libgcc_s.so.1]
     0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
     0x0000000000000001 (NEEDED)             Shared library: [ld-linux-x86-64.so.2]
     0x000000000000000e (SONAME)             Library soname: [libmy_realtime_vdo_slam.so]
     0x000000000000001d (RUNPATH)            Library runpath: [/home/tranks/testing_ws/devel/lib:/opt/ros/melodic/lib:/usr/local/lib]
     0x000000000000000c (INIT)               0xd0bd0
     0x000000000000000d (FINI)               0x129494
     0x0000000000000019 (INIT_ARRAY)         0x35f580
     0x000000000000001b (INIT_ARRAYSZ)       56 (bytes)
     0x000000000000001a (FINI_ARRAY)         0x35f5b8
     0x000000000000001c (FINI_ARRAYSZ)       8 (bytes)
     0x000000006ffffef5 (GNU_HASH)           0x1f0
     0x0000000000000005 (STRTAB)             0x2be68
     0x0000000000000006 (SYMTAB)             0xa7d8
     0x000000000000000a (STRSZ)              545696 (bytes)
     0x000000000000000b (SYMENT)             24 (bytes)
     0x0000000000000003 (PLTGOT)             0x362000
     0x0000000000000002 (PLTRELSZ)           90336 (bytes)
     0x0000000000000014 (PLTREL)             RELA
     0x0000000000000017 (JMPREL)             0xbaaf0
     0x0000000000000007 (RELA)               0xb4058
     0x0000000000000008 (RELASZ)             27288 (bytes)
     0x0000000000000009 (RELAENT)            24 (bytes)
     0x000000006ffffffe (VERNEED)            0xb3e98
     0x000000006fffffff (VERNEEDNUM)         6
     0x000000006ffffff0 (VERSYM)             0xb1208
     0x000000006ffffff9 (RELACOUNT)          9
     0x0000000000000000 (NULL)               0x0

这是我的CMakeList.txt

cmake_minimum_required(VERSION 3.10)
project(my_realtime_vdo_slam)

find_package(catkin REQUIRED COMPONENTS
  cv_bridge
  flow_net
  geometry_msgs
  image_transport
  mask_rcnn
  message_generation
  midas_ros
  mono_depth_2
  nav_msgs
  python_service_starter
  roscpp
  sensor_msgs
  std_msgs
  tf
  tf2
  tf2_geometry_msgs
  tf2_ros
  tf2_sensor_msgs
  vision_msgs
  visualization_msgs
  nodelet
  message_filters
)

find_package(OpenCV)
find_package(vdo_slam REQUIRED)

## Generate messages in the 'msg' folder
add_message_files(
   FILES
   VdoSlamScene.msg
   VdoSlamMap.msg
   VdoSceneObject.msg
   VdoInput.msg
)

generate_messages(
  DEPENDENCIES 
    actionlib_msgs 
    geometry_msgs 
    std_msgs 
    sensor_msgs 
    mask_rcnn 
    vision_msgs
)


set(PROJECT_INCLUDE_DIRS
  include
  ${catkin_INCLUDE_DIRS}
  ${OpenCV_INCLUDE_DIRS}
  ${vdo_slam_INCLUDE_DIRS}
  )

include_directories(
  ${PROJECT_INCLUDE_DIRS}
)  


catkin_package(
  INCLUDE_DIRS ${PROJECT_INCLUDE_DIRS}
  LIBRARIES ${PROJECT_NAME} 
  CATKIN_DEPENDS 
    roscpp
    image_transport 
    python_service_starter 
    std_msgs 
    tf 
    tf2 
    tf2_geometry_msgs 
    tf2_ros 
    tf2_sensor_msgs 
    nav_msgs 
    sensor_msgs 
    geometry_msgs 
    cv_bridge 
    flow_net 
    mask_rcnn 
    mono_depth_2 
    midas_ros 
    message_runtime 
    nodelet
    message_filters
  # DEPENDS system_lib
)

add_library(${PROJECT_NAME} SHARED 
  src/RosVdoSlam.cpp
  src/utils/RosUtils.cpp
  src/visualizer/RosVisualizer.cpp
  src/visualizer/RosAsyncManager.cpp
  src/tracking/HungarianSolver.cpp
  src/tracking/SemanticTracker.cpp
)
target_link_libraries(${PROJECT_NAME} PUBLIC
        ${catkin_LIBRARIES}
        ${OpenCV_LIBS}
        ${vdo_slam_LIBRARIES}
)
#if(catkin_EXPORTED_LIBRARIES)
#  add_dependencies(${PROJECT_NAME}
#         ${catkin_EXPORTED_LIBRARIES}
#         ${catkin_LIBRARIES}
#         ${OpenCV_LIBS}
 #     ${vdo_slam_LIB_DIRS})
# endif()

# target_include_directories(${PROJECT_NAME} SYSTEM PUBLIC
#     ${catkin_INCLUDE_DIRS}
#     ${OpenCV_INCLUDE_DIRS}
#     ${vdo_slam_INCLUDE_DIRS}
#     $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
#     $<INSTALL_INTERFACE:include>
# )


add_executable(ros_vdoslam_node 
  src/ros_vdoslam_node.cpp
)

target_link_libraries(ros_vdoslam_node 
  ${catkin_LIBRARIES}
  ${OpenCV_LIBS}
  ${vdo_slam_LIB_DIRS}
  ${PROJECT_NAME}
  )

if(catkin_EXPORTED_LIBRARIES)
  add_dependencies(ros_vdoslam_node
          ${catkin_EXPORTED_LIBRARIES}
          ${catkin_LIBRARIES}
          ${OpenCV_LIBS}
      ${vdo_slam_LIBRARIES})
endif()

【问题讨论】:

  • 如果您已经构建并安装了 "vdo_slam" 并在 /usr/local/include/vdo_slam 中添加了标头,那么我希望在某处看到 libObjSLAM.so
  • @AlexCohn 我可以在 /usr/local/lib/ 中看到 libvdo_slam.so。由于我还在 CMakelist.txt 中找到了_packaged 并将其链接,因此我希望在运行$ readelf &lt;mylibrary.so_file&gt; 时在共享库列表中看到 libvdo_slam.so,但它不存在。所以我在 CMakeList.txt 中运行了一个简短的 if 语句来检查if(vdo_slam_FOUND) 标志,如果找到,打印一些消息。它输出找到的消息。
  • 为什么你的target_link_libraries 包含${vdo_slam_LIB_DIRS},而不是${vdo_slam_LIBS}

标签: makefile cmake shared-libraries undefined-reference


【解决方案1】:

尤里卡! 我找到了一个解决方案,虽然它不是一个理想的解决方案。如问题中所述,我注意到libvdo_slam.so 在运行$ readelf &lt;on_my_library.so&gt; 时未列为共享库。所以我在 CMakeList.txt 中手动添加了-lvdo_slam,所以它看起来像:

target_link_libraries(ros_vdoslam_node  
  ${catkin_LIBRARIES}  
  ${OpenCV_LIBS}    
  ${PROJECT_NAME}  
  -lvdo_slam  
  )  `

此外,由于“vdo_slam”还使用了修改后的“g2o”库,因此必须在 VDO_SLAM 库的 CMakeList.txt(添加-lvdo_slam_g2o 在类似的地方)。

虽然现在构建成功了,但我还是想知道为什么会这样。据我了解,-lvdo_slam${vdo_slam_LIBS}是一样的,后者在使用find_package(vdo_slam REQUIRED)后应该是有效的

【讨论】:

    猜你喜欢
    • 2020-03-25
    • 2020-02-14
    • 2022-06-10
    • 2021-10-23
    • 1970-01-01
    • 2021-07-31
    相关资源
    最近更新 更多