ROS 链接动态库时需要注意的一些问题:写的每个包最好只生成一个动态库,不要生成多个动态库,否则会出现链接错误。
笔者在工程中发现如果对 ROS 项目中的某个包生成动态库时,生成了两个以上的动态库,那么就会在其它包引用这个包时出现链接错误。 例如,我实现了一个轨迹优化的包 traj_opt
,该包的 CMakeLists.txt
文件中,有下面的内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| include_directories ( SYSTEM include ${catkin_INCLUDE_DIRS} ${Eigen3_INCLUDE_DIRS} ${PCL_INCLUDE_DIRS} )
add_library ( minisnap src/mini_snap.cpp ) target_link_libraries ( minisnap ${catkin_LIBRARIES} osqp:: osqp )
add_library ( traj_opt src/poly_traj_optimizer.cpp ) target_link_libraries ( traj_opt ${catkin_LIBRARIES} )
add_executable ( test_minisnap src/test_minisnap.cpp ) target_link_libraries ( test_minisnap ${catkin_LIBRARIES} minisnap )
|
这里的本意是想要生成两个动态库,一个用于 minisnap
的轨迹优化,另一个为 traj_opt
,用于基于 MINCO 的轨迹优化。但是笔者发现,在外部引用这个包时,只能成功链接一个动态库,而不是两个。例如,笔者在另外一个包路径规划包 planning
中引用了这个轨迹优化包。在其 CMakeLists.txt
文件中,笔者这样写
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| find_package ( catkin REQUIRED COMPONENTS roscpp rospy std_msgs message_filters sensor_msgs image_transport mav_msgs quadrotor_msgs traj_utils traj_opt )
add_definitions ( ${PCL_DEFINITIONS} )
catkin_package ( INCLUDE_DIRS include LIBRARIES rast_corridor_planning CATKIN_DEPENDS roscpp traj_opt traj_utils )
include_directories ( include SYSTEM ${catkin_INCLUDE_DIRS}${PROJECT_SOURCE_DIR}/include ${PCL_INCLUDE_DIRS} ${Eigen3_INCLUDE_DIRS} )
include_directories ( /usr/local/include/munkres ) set ( MunkresLIB /usr/local/lib/libmunkres.a )
add_executable ( map_sim_example src/map_sim_example.cpp ) target_link_libraries ( map_sim_example ${catkin_LIBRARIES}${PCL_LIBRARIES} ${MunkresLIB} )
add_executable ( multi_planning_node src/multi_planning_node.cpp src/multi_planning.cpp )
target_link_libraries ( multi_planning_node ${catkin_LIBRARIES} )
|
笔者发现要生成的可执行文件 multi_planning_node
中出现 minisnap
动态库的链接错误。当笔者将轨迹优化包的 CMakeLists.txt
文件修改为以下形式后,该问题就消失了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| include_directories ( SYSTEM include ${catkin_INCLUDE_DIRS} ${Eigen3_INCLUDE_DIRS} ${PCL_INCLUDE_DIRS} )
add_library ( traj_opt src/poly_traj_optimizer.cpp src/mini_snap.cpp )
target_link_libraries ( traj_opt ${catkin_LIBRARIES} osqp:: osqp )
add_executable ( test_minisnap src/test_minisnap.cpp ) target_link_libraries ( test_minisnap ${catkin_LIBRARIES} traj_opt )
|