将 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。
我一直在使用库 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。