gpt4 book ai didi

git-submodules - 柳絮/ROS : How-to specify include path correctly when using submodules

转载 作者:行者123 更新时间:2023-12-05 06:34:50 26 4
gpt4 key购买 nike

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

我面临的问题是:我在一个包(包 A)中使用一个 git 子模块(因此,我有一个分层的包含文件夹结构)并且我在引用该子模块中的头文件时遇到困难。

为了构建依赖于包 A 的包 B,我在包 A 中的 catkin_package 命令中添加了 INCLUDE_DIRS 语句:

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

该目录的内容是:

my-submodule/my-header.h

(我把头文件放在一个文件夹下,以子模块命名,因为许多教程都指出在 ROS 中你应该使用这个约定)。

package-B 文件中的 include 语句如下所示:

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

这工作正常 - 正在构建包 B(因为我正在使用一个组合工作区来构建它)。

但是:当我切换到目标系统时,我只安装包 A,然后尝试构建包 B(在该目标系统上),它不会构建,因为包含路径是设置不正确。

包 A 的 INSTALL 语句如下所示

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

因此,安装过程实际上将该子模块的包含路径放在 package-A-include 路径下(与我直接在一个组合工作区中构建包时相比,这是一种不同的路径结构)。

而用于编译的CFLAGS只将include目录设置为文件夹:

.../ros/include

因此,破坏了我的 package-B 文件中的 include 语句:

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

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

最佳答案

假设您有一个文件 my-submodule/include/my-submodule/my-header.h在你的包 A 中,然后对你的 install() 语句进行两个小的更改应该可以解决这个问题:

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

首先,在路径中添加一个斜杠(.../include/ 而不是 .../include),这导致了 include内容要安装的文件夹而不是 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_package(
INCLUDE_DIRS my-submodule/include
...
)

理论上应该已经导出 my-submodule/include , 所以你可以在包 B 中使用

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-as-expected-when-using-install/ .

关于git-submodules - 柳絮/ROS : How-to specify include path correctly when using submodules,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50009126/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com