拙笔集

遵四时以叹逝,瞻万物而思纷。悲落叶于劲秋,喜柔条于芳春。

0%

ROS 链接动态库

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}
# minisnap
traj_opt
)