catkin / ros:使用子模块时正确指定正确的路径



我正在使用ROS构建一个项目,因此,Catkin_make构建我的ROS节点和库。

我面临的问题是:我在一个软件包中使用了git子模块(软件包A((因此,我有一个层次结构包含文件夹结构(,并且在该subpoule中引用标头文件很难。

为了构建依赖包A的软件包B

catkin_package(
  INCLUDE_DIRS my-submodule/include
  ...
)

该目录的内容是:

my-submodule/my-header.h

(我已经将标题文件放在以subsodule命名的文件夹下

package-b中的文件中的include语句如下:

...
#include <my-submodule/my-header.h>
...

这可以正常工作 - 构建包B(当我使用一个组合工作空间来构建此空间时(。

ut:当我切换到目标系统时,i 仅安装 package a,然后尝试构建软件包b(在该目标系统上(,它不会构建,因为包含路径是未正确设置。

包装A的安装语句看起来像

install(DIRECTORY my-submodule/include
  DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
  FILES_MATCHING PATTERN "*.h"
  PATTERN ".svn" EXCLUDE
)

这主要是因为目标系统上的已安装文件夹结构如下:

.../ros/include/my-package-A/include/my-submodule/my-header.h

因此,安装过程实际上将suppodule的包含路径放置在包装中的路径下(与直接在一个组合工作空间构建包装时,这是一个不同的路径结构(。

和用于编译的cflags仅将Include目录设置为文件夹:

.../ros/include

,因此,将我的包含语句打破了我的软件包-B文件:

#include <my-submodule/my-header.h>

您知道如何解决这个问题吗?我确定有比我更多的人,试图从软件包中的子模块中引用标头文件。

假设您的软件包A内有一个文件my-submodule/include/my-submodule/my-header.h,则对您的install((语句进行了两个小更改,应解决此问题:

install(DIRECTORY my-submodule/include/
  DESTINATION ${CATKIN_GLOBAL_INCLUDE_DESTINATION}
  FILES_MATCHING PATTERN "*.h"
  PATTERN ".svn" EXCLUDE
)

首先,在路径(.../include/而不是.../include(中添加斜线,这会导致安装include文件夹的 contents 而不是include文件夹本身(否则,您最终会出现../ros/install/include/include/my-submodule/my-header.h(

其次,使用${CATKIN_GLOBAL_INCLUDE_DESTINATION}(指向.../ros/install/include/(,而不是${CATKIN_PACKAGE_INCLUDE_DESTINATION}(指向.../ros/install/my-package-A/include/(作为目标。


替代方案是修复catkin,为

catkin_package(
  INCLUDE_DIRS my-submodule/include
  ...
)

理论上应该已经导出 my-submodule/include,因此您可以在

的包装中捡起它
find_package(catkin REQUIRED DEPENDS my-package-A)
catkin_package(
    CATKIN_DEPENDS my-package-A
)
include_directories(${catkin_INCLUDE_DIRS})

不幸的是,由于某种原因,使用catkin config --install时明确无法实现。请参阅https://answers.ros.org/question/335846/install_dirs-not-working-working-as-xeard-when-when-using-install/。

最新更新