将 MRPT 的 includes 和 libs 作为依赖库传递

Pass includes and libs of MRPT as a dependency library

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

我一直在我的 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 在项目 A 中看到 headers? 除了 catkin_package 之外,还有更好的方法将依赖项传递给 libA 的使用者吗?

此致。

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

target_link_libraries(MyexeA PUBLIC ${MRPT_LIBRARIES})

此外,添加 PUBLIC 或 PRIVATE 用于 target_link_libraries() 的任何其他用途。

而且,正如@Tsyvarev 告诉您的那样,您必须导出您的项目 cmake 目标,这样一切才能无缝运行。 例如,参见 this tutorial