CMake Error at /opt/ros/melodic/share/catkin/cmake/catkin_workspace.cmake:121 (add_subdirectory): add_subdirectory not given a binary directory but the given source directory "/home/csh/champion_nav_msgs/src/champion_nav_msgs" is not a subdirectory of "/home/csh/champion_nav_msgs/src/champion_nav_msgs". When specifying an out-of-tree source a binary directory must be explicitly specified. Call Stack (most recent call first): champion_nav_msgs/CMakeLists.txt:78 (catkin_workspace) -- Configuring incomplete, errors occurred! See also "/home/csh/champion_nav_msgs/build/CMakeFiles/CMakeOutput.log". See also "/home/csh/champion_nav_msgs/build/CMakeFiles/CMakeError.log". Invoking "cmake" failed
时间: 2025-04-01 15:04:38 浏览: 118
<think>好的,我现在需要帮助用户解决他们在使用CMake时遇到的add_subdirectory错误,特别是在ROS Melodic环境下。首先,我得仔细分析用户提供的错误信息和已有的引用内容。
用户提到的错误是“CMake Error at catkin_workspace.cmake add_subdirectory not a subdirectory”,同时他们引用了关于缺少ros-kinetic-octomap-ros的解决方案,并提到需要将下划线替换为短横线来安装包。但用户现在使用的是ROS Melodic,所以需要调整对应的包名称。
首先,add_subdirectory错误通常是因为指定的路径不存在或CMake无法找到该目录。用户可能在CMakeLists.txt中错误地指定了子目录的路径。我需要检查几个可能的原因:
1. **路径错误**:确认add_subdirectory中的路径是否正确,是否相对于当前CMakeLists.txt的位置存在。比如,如果子目录名为“src”,但实际路径是“../src”,就会出错。
2. **包依赖缺失**:用户之前的引用提到缺少octomap_ros,需要安装对应的ROS包。在Melodic中,正确的包名应该是ros-melodic-octomap-ros,因为ROS的包命名惯例是ros-<发行版>-<包名>,并且包名中的下划线通常会被替换为短横线。用户可能没有正确安装所需的依赖,导致CMake在配置时找不到必要的文件,从而引发后续错误,包括add_subdirectory的问题。
3. **CMake文件配置错误**:可能在catkin_workspace.cmake中有语法错误或不正确的变量使用,导致add_subdirectory的路径解析错误。需要检查该文件中的相关部分,确保所有变量如${CATKIN_DEVEL_PREFIX}等已正确设置。
接下来,我需要逐步为用户提供解决方案:
- **确认子目录路径**:建议用户检查add_subdirectory的参数,使用绝对路径或正确的相对路径。可以用get_filename_component来解析路径,确保其存在。
- **安装缺失的依赖**:根据引用中的例子,用户需要安装ros-melodic-octomap-ros,以及其他可能的依赖包。使用sudo apt-get install命令安装,并提醒用户替换发行版名称和下划线为短横线。
- **验证CMake文件语法**:检查是否有拼写错误或错误变量,例如错误地使用了CATKIN_DEVEL_PREFIX而实际应为其他变量。同时,确保所有find_package和catkin_package的调用正确无误。
- **清理和重新构建**:建议用户删除build和devel目录后重新运行catkin_make,避免旧的缓存文件导致问题。
此外,用户可能的问题还可能涉及到ROS工作空间的结构是否正确,是否初始化了工作空间,或者是否有其他缺失的依赖包。需要提醒用户按照ROS的最佳实践来组织工作空间,并确保所有必要的包都已安装。
最后,生成相关问题,帮助用户进一步排查可能的其他错误,比如路径问题、依赖安装、环境变量设置等。这些问题可以引导用户系统地检查他们的配置,确保彻底解决问题。</think>### CMake构建错误解决方案
对于CMake构建时出现的`add_subdirectory`错误,结合ROS Melodic环境,以下是分步解决方案:
#### 1. 检查子目录路径有效性
错误`add_subdirectory not a subdirectory`表示CMake无法找到指定的子目录路径。
**操作步骤**:
- 确认`add_subdirectory`中路径参数是否为**相对路径**且相对于当前`CMakeLists.txt`文件
- 示例:若子目录为`src`,应确保其存在于当前目录下,否则需调整路径
- 使用`get_filename_component`验证路径是否存在:
```cmake
get_filename_component(SUB_DIR_PATH "your/subdirectory/path" ABSOLUTE)
if(EXISTS ${SUB_DIR_PATH})
add_subdirectory(${SUB_DIR_PATH})
endif()
```
#### 2. 安装缺失的ROS依赖包
根据引用信息,缺少`octomap_ros`包时需注意**ROS包命名规则**:
- **Kinetic**版本包名格式:`ros-kinetic-<包名>`
- **Melodic**版本包名格式:`ros-melodic-<包名>`
**安装命令**:
```bash
# 安装octomap_ros(注意替换下划线为短横线)
sudo apt-get install ros-melodic-octomap-ros
# 检查其他可能缺失的依赖
sudo apt-get install ros-melodic-cmake-modules ros-melodic-pcl-ros
```
#### 3. 验证catkin工作空间配置
确保工作空间初始化正确:
```bash
# 创建并初始化工作空间
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/
catkin_make
source devel/setup.bash
```
#### 4. 检查CMake文件语法
在`catkin_workspace.cmake`中需注意:
- 使用`find_package`正确声明依赖
- 确认`catkin_package()`调用包含所有依赖项
- 示例配置片段:
```cmake
find_package(catkin REQUIRED COMPONENTS
roscpp
octomap_ros # 此处使用原始包名,非安装时的短横线格式
)
catkin_package(
CATKIN_DEPENDS roscpp octomap_ros
)
```
#### 5. 清理重建工作空间
```bash
cd ~/catkin_ws
rm -rf build devel # 清理旧构建
catkin_make clean # 可选清理命令
catkin_make
```
阅读全文
相关推荐


















