我正在使用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/。