2

我正在使用 ROS ament 工具构建我的包。结构如下

LibA (build as shared library)

LibB (depends on LibA & build as shared library)

AppB (depends on LinB)

在 LibB 的 package.xml 中。我将依赖项指定为...

package.xml (under dir LibB)

<build_depend>libA</build_depend>

在 AppB 的 package.xml 中。我将依赖项指定为...

package.xml (under dir AppB)

<build_depend>libA</build_depend>
<build_depend>libB</build_depend>

现在构建顺序是正确的,因为..

# Topological order
 - libA
 - libB
 - AppB

现在问题在构建 AppB 时开始,它找不到 LibA 和 LibB 的链接。

问题

如何将 LibA 链接到 LibB ?(我应该使用什么语法)

如何将 LibA、LibB 链接到 AppB ?

4

1 回答 1

1

也许你应该ament_export在 LibACMakeLists.txt中使用,ROS2 的这个页面应该会有所帮助

# CMakeLists.txt for LibA
add_library(LibA SHARED src/LibA.cpp)
ament_target_dependencies(LibA rclcpp)
ament_export_interfaces(export_LibA HAS_LIBRARY_TARGET)
ament_export_libraries(LibA)
ament_export_include_directories(include)
ament_export_dependencies(
    ament_cmake
    rclcpp
)
install(
    TARGETS LibA
    EXPORT export_LibA
    LIBRARY DESTINATION lib/${PROJECT_NAME}
    ARCHIVE DESTINATION lib/${PROJECT_NAME}
    RUNTIME DESTINATION lib/${PROJECT_NAME}
)
install(
    DIRECTORY include/
    DESTINATION include
)

然后CMakeLists.txt从 LibB 你应该有

# CMakeLists.txt for LibB
find_package(LibA REQUIRED)
add_library(LibB SHARED src/LibB.cpp)
target_include_directories(LibB PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
    $<INSTALL_INTERFACE:include>
)
ament_target_dependencies(LibB
    rclcpp
    LibA
)
ament_export_libraries(LibB)
ament_export_include_directories(include)
ament_export_dependencies(
    rclcpp
    LibA
)
install(
    TARGETS LibB
    EXPORT export_LibB
    LIBRARY DESTINATION lib/${PROJECT_NAME}
    ARCHIVE DESTINATION lib/${PROJECT_NAME}
    RUNTIME DESTINATION lib/${PROJECT_NAME}
)
install(
    DIRECTORY include/
    DESTINATION include
)

要使用LibAand LibBwith AppB,我认为您需要使用ament_target_dependencieswithLibB作为参数,然后使用add_executable()函数

我想你可以改变<build_depend>标签<depend>

于 2019-09-05T17:49:17.923 回答