1

我一直在使用库 mrpt 来包装 ROS 周围的 difodo 算法。我的系统规格是:Ubuntu 18.04 并且我使用 mrpt 平台的 ppa 安装了 mrpt,目前我获得了 mrpt 的 1.9.9 版本。

我一直在我的 cmake 中使用以下内容在我创建的代码中使用 mrpt,如下所示:

find_package(MRPT REQUIRED poses gui vision)
# I got these variables
MRPT_LIBRARIES=mrpt::poses;mrpt::gui;mrpt::vision

MRPT_CONFIG=/usr/share/mrpt/mrpt-config.cmake
MRPT_CONSIDERED_CONFIGS=/usr/share/mrpt/mrpt-config.cmake
MRPT_CONSIDERED_VERSIONS=1.9.9
MRPT_DIR=/usr/share/mrpt
MRPT_FOUND=1
MRPT_LIBS=mrpt::poses;mrpt::gui;mrpt::vision
MRPT_VERSION=1.9.9
MRPT_VERSION_COUNT=3
MRPT_VERSION_MAJOR=1
MRPT_VERSION_MINOR=9
MRPT_VERSION_PATCH=9
MRPT_VERSION_TWEAK=0

.
.
.
target_link_libraries(MyexeA ${MRPT_LIBRARIES})
target_link_libraries(MyLibA ${MRPT_LIBRARIES})

到目前为止,这对 MyExeA 来说非常有效。现在我想创建一个 MyLibA 并在其他项目上使用这个库。

我的目标是自动包含所有 MRPT 依赖项(库和包含路径),因此在 projectB.CMakefile 中我会这样做:

find_package(myprojectA REQUIRED)

MRPT 会自动加载。这样依赖树就是mrpt->projectA->ProjectB

我想避免在 projectB cmake 中再次 find_package() MRPT。

我试过什么? 我一直在使用 catkin_package() 添加所有依赖项,并包括如下所需:

catkin_package(
        INCLUDE_DIRS include
        LIBRARIES ${PROJECT_NAME} ${OpenCV_LIBS}
        CATKIN_DEPENDS roscpp cv_bridge image_transport rospy std_msgs
        DEPENDS OpenCV MRPT)

但是当我这样做时,projectB 无法从 MRPT 中找到包含。

我的下一个尝试是使用 MRPT_LIBRARIES 和 MRPT_INCLUDE_DIRS 变量添加到 catking 包中,但 MRPT 似乎没有 MRPT_INCLUDE_DIRS,所以我无法知道包含目录在哪里。

我怎样才能做到这一点?MRPT 在哪里添加 INCLUDE_DIRS 使 CMAKE 在 projectA 中看到标题?除了 catkin_package 是否有更好的方法将依赖项传递给 libA 的消费者?

问候。

4

1 回答 1

0

您需要将 MRPT 指定为项目的 PUBLIC 依赖项:

target_link_libraries(MyexeA PUBLIC ${MRPT_LIBRARIES})

此外,添加 PUBLIC 或 PRIVATE 以用于target_link_libraries().

而且,正如@Tsyvarev 告诉你的那样,你必须导出你的项目 cmake 目标才能让一切无缝工作。例如,请参阅本教程

于 2020-03-24T21:18:55.813 回答