查找对方包时的cmake包配置

Posted

技术标签:

【中文标题】查找对方包时的cmake包配置【英文标题】:Cmake package configuration when looking for each other's packages 【发布时间】:2021-06-27 10:25:27 【问题描述】:

当我catkin_makemodule_one找到包module_twomodule_two找到包module_one时,出现如下错误

-- +++ processing catkin package: 'module_one'
-- ==> add_subdirectory(module_one)
-- Could NOT find module_two (missing: module_two_DIR)
-- Could not find the required component 'module_two'. The following CMake error indicates that you either need to install the package with the same name or change your environment so that it can be found.
CMake Error at /opt/ros/melodic/share/catkin/cmake/catkinConfig.cmake:83 (find_package):
  Could not find a package configuration file provided by "module_two" with
  any of the following names:

    module_twoConfig.cmake
    module_two-config.cmake

  Add the installation prefix of "module_two" to CMAKE_PREFIX_PATH or set
  "module_two_DIR" to a directory containing one of the above files.  If
  "module_two" provides a separate development package or SDK, be sure it has
  been installed.
Call Stack (most recent call first):
  module_one/CMakeLists.txt:10 (find_package)


-- Configuring incomplete, errors occurred!
See also "/home/ri/workspace/catkin_playground/build/CMakeFiles/CMakeOutput.log".
See also "/home/ri/workspace/catkin_playground/build/CMakeFiles/CMakeError.log".

工作区文件夹树在下面

├── build
│   ├── atomic_configure
│   ├── catkin
│   │   └── catkin_generated
│   │       └── version
│   ├── catkin_generated
│   │   ├── installspace
│   │   └── stamps
│   │       └── Project
│   ├── CMakeFiles
│   │   ├── 3.11.0
│   │   │   ├── CompilerIdC
│   │   │   │   └── tmp
│   │   │   └── CompilerIdCXX
│   │   │       └── tmp
│   │   └── CMakeTmp
│   ├── gtest
│   │   ├── CMakeFiles
│   │   └── googlemock
│   │       ├── CMakeFiles
│   │       └── gtest
│   │           └── CMakeFiles
│   ├── module_one
│   │   └── CMakeFiles
│   └── test_results
├── devel
│   └── lib
└── src
    ├── module_one
    └── module_two

module_one 的 CMakeLists.txt 有

find_package(catkin REQUIRED module_two)

module_two 的 CMakeLists.txt 有

find_package(catkin REQUIRED module_one)

像上面的项目, 是否有用于相互引用包的 CMakeLists 配置?

【问题讨论】:

不确定,但是否可以将catkin 放入一些module3,然后使module1module2module3 中查找包? 【参考方案1】:

我试图模仿你的设置:我创建了一个新的工作区,我使用 catkin_create_pkg 创建了两个新包,我得到了你的错误。如果未解决以下一些设置问题,则会发生这种情况:

在 CMakeLists.txt 中,您必须find_package(catkin REQUIRED COMPONENTS ...) 必要的包(如果您使用 C++,请不要忘记 roscpp!)
# In module_1
find_package(catkin REQUIRED COMPONENTS
  roscpp
  module_2
)
在 CMakeLists.txt 中,您还必须声明 catkin 依赖项(此 CATKIN_DEPENDS 列表是上述 find_package 列表的镜像):
# In module_1
catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES mod2
  CATKIN_DEPENDS roscpp module_2
#  DEPENDS system_lib
)
在 package.xml 中,您还需要该模块的 <depend>
<!-- In module_1 -->
<depend>module_2</depend>

如果你做了所有这些,那么这个错误就会消失。但是你有一个新的错误:

包子集中的循环依赖:module_1、module_2

我建议您重新构建代码以避免循环依赖,方法是组合包,或者如果您更喜欢小包,则将公共依赖项提取到第三个包。

【讨论】:

感谢您的回答。对,真正的问题是循环依赖。

以上是关于查找对方包时的cmake包配置的主要内容,如果未能解决你的问题,请参考以下文章

npm下载包时代理配置

为啥在创建包时必须在 webpack 配置中将 peerDependencies 列为外部项?

从 NFQueue 读取数据包时的零序号

尝试使用包时的ModuleNotFoundError

程序包前端管理工具yum,及仓库配置

本地 CPU 可能会降低接收数据包时的远程 CPU 性能