cmake错误集锦:关于include_directories()

在代码中我们可能回去这样include的一个c/c++头文件:

#include "common/time/a.h"

使用相对路径的方式包含引用了一个头文件,然后我们在CMakeLists.txt中这样写:

include_directories(
	/home/xxx/project_path/common/time
)

编译的时候发现,编译无法通过,报代码中的a.h无法找到。

解决:
细心一点不难发现,确实无法找到,因为/home/xxx/project_path/common/time 下面没有common/time这个子目录。更没有a.h这个头文件。修改一下包含路径即可:

include_directories(
	/home/xxx/project_path/
)

这样路径拼接起来自然就找到了。这是以前刚使用cmake时犯的错误,突然想起来记录一下。

### 缺少 `rosbag2_cpp/serialization.hpp` 文件的解决方案 当遇到类似于 `fatal error: rosbag2_cpp/serialization.hpp: No such file or directory` 的错误时,通常是因为开发环境中缺少必要的 ROS 2 软件包或其依赖项。以下是针对此问题的具体分析和解决方法: #### 1. 安装 ROS 2 和相关组件 如果尚未安装 ROS 2 或者未正确配置环境变量,则可能导致无法找到所需的头文件。可以通过以下命令来安装 ROS 2 及其核心功能包: ```bash sudo apt update && sudo apt upgrade sudo apt install ros-<distro>-desktop source /opt/ros/<distro>/setup.bash ``` 其中 `<distro>` 是指代当前使用的 ROS 2 发行版名称(例如 foxy、humble)。确保已设置正确的发行版并更新 shell 配置文件以便每次启动终端都能加载 ROS 环境。 #### 2. 显式安装 `rosbag2` 相关软件包 为了支持序列化操作以及访问 `serialization.hpp` 头文件,需单独确认是否已经安装了 `rosbag2` 组件及其依赖库。执行如下指令可以完成这些必要模块的获取与部署: ```bash sudo apt install ros-<distro>-rosbag2 ros-<distro>-rosbag2-converter-default-plugins ros-<distro>-rosbag2-storage-default-plugins ``` #### 3. 检查 Boost 库是否存在及版本匹配情况 部分情况下,即使安装好了上述提到的所有工具链仍会遭遇类似的找不到特定头文件的情况。这可能涉及到第三方开源项目Boost的存在与否或者版本兼容性方面的问题。因此建议先验证系统上是否有安装最新稳定版的Boost集合并通过下面的方式加以修正: ```bash sudo apt-get install --no-install-recommends libboost-all-dev ``` 这条语句能够帮助我们引入完整的Boost框架集锦到Linux操作系统之中[^3]。 #### 4. 修改 CMakeLists.txt 添加查找路径 有时即便完成了以上步骤还是会出现同样的报错现象,这时候就需要回到项目的源码目录下编辑CMake脚本,在里面指定额外的搜索位置让构建器知道去哪里寻找那些外部资源。比如对于这个问题来说可以在适当的位置加入这样一段代码片段: ```cmake find_package(ament_cmake REQUIRED) if(NOT rosbag2_cpp_FOUND) find_path(ROSBAG2_CPP_INCLUDE_DIR NAMES rosbag2_cpp/serialization.hpp PATHS "/opt/ros/${ROS_DISTRO}/include/") endif() target_include_directories(${PROJECT_NAME} PRIVATE ${ROSBAG2_CPP_INCLUDE_DIR}) ``` 通过这样的方式手动告知编译程序应该去哪些地方定位所需的内容从而避免遗漏任何重要的组成部分[^4]。 --- ### 提供的相关代码样例 这里给出一个简单的例子展示如何利用CMake来管理复杂的跨平台工程结构的同时也包含了刚才讨论过的处理机制的一部分实现细节作为参考依据之一。 ```cmake cmake_minimum_required(VERSION 3.5) project(example_project LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_BUILD_TYPE Release) add_executable(main main.cpp) # 寻找RosBag2Cpp头文件所在地址 find_package(AmentCMake REQUIRED COMPONENTS rosbag2_cpp) if(EXISTS "${rosbag2_cpp_DIR}") include_directories("${rosbag2_cpp_DIR}/../include") else() message(FATAL_ERROR "Cannot locate RosBag2Cpp headers.") endif() target_link_libraries(main ament_index_cpp::ament_index_cpp rosbag2_cpp::rosbag2_cpp) ``` --- ### 总结说明 综上所述,要彻底消除因缺乏某些关键性的头文件而导致的编译失败状况可以从以下几个角度切入解决问题:一是保证基础运行环境搭建无误;二是按需补充缺失的功能插件;三是调整现有构建流程使之适应实际需求场景下的变化趋势。只有做到全面覆盖各个环节才能有效提升整体工作效率减少不必要的麻烦发生几率。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值