• ROS功能包编译报错fatal error: xxxxConfig.h: 没有那个文件或目录的解决方法及原理介绍


       在ROS中,我们常使用动态调参工具或参数配置文件来进行参数调节,在编译时会生成对应的Config.h文件,如本文例子中的MPCPlannerConfig.h文件

       一、报错原因及解决方法

       在编译时报以下错误的原因是在编译生成可执行文件mpc_ros的过程中需要使用MPCPlannerConfig.h文件,而此时MPCPlannerConfig.h还没有生成。

    In file included from /home/gly/catkin_ws/src/local_planner_plugin/mpc_ros-melodic/mpc_ros/src/mpc_plannner_ros.cpp:17:
    /home/gly/catkin_ws/src/local_planner_plugin/mpc_ros-melodic/mpc_ros/include/mpc_plannner_ros.h:41:10: fatal error: mpc_ros/MPCPlannerConfig.h: 没有那个文件或目录
       41 | #include <mpc_ros/MPCPlannerConfig.h>
          |          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
    compilation terminated.
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

       所以,对该功能包的修改CMakeLists.txt文件进行修改,指定编译顺序,在生成mpc_ros文件前,先生成其所需要的文件即可,具体的解决方法如下:

       ① 根据报错信息,找出是那个可执行文件编译过程中缺失了所需文件

       本文的例子中,从报错信息中容易知道是编译mpc_plannner_ros.cpp时报的错

       ②打开本功能包中的CMakeLists.txt文件,并找到上一步中找到的文件的编译语句

       本文的例子中,CMakeLists.txt文件中mpc_plannner_ros.cpp的编译语句如下:

    add_library(mpc_ros src/mpc_plannner_ros.cpp src/mpc_plannner.cpp)
    TARGET_LINK_LIBRARIES(mpc_ros ipopt ${catkin_LIBRARIES} )
    
    • 1
    • 2

       ③在上一步找到的编译语句后面,添加指定catkin_make编译顺序的指令

    add_dependencies( 编译生成的可执行文件名 ${${PROJECT_NAME}_EXPORTED_TARGETS})
    
    • 1

       本文的例子中,mpc_plannner_ros.cpp编译生成的可执行文件名为mpc_ros,所以添加的语句为:

    add_dependencies(mpc_ros ${${PROJECT_NAME}_EXPORTED_TARGETS})
    
    • 1

       如下图所示:
    在这里插入图片描述


       二、相关编译指令原理介绍

       1.、add_library

    add_library(mpc_ros src/mpc_plannner_ros.cpp src/mpc_plannner.cpp)
    
    • 1

       - 作用:这个指令的作用是创建一个共享库(shared library)称为 mpc_ros,并将指定的源文件 mpc_planner_ros.cppmpc_planner.cpp 编译成库。这个库可以在其他项目中被链接和使用。

       - 原理:在CMake项目中,add_library 用于定义和创建一个库。它会将指定的源文件编译成目标库,使得其他项目可以链接该库来使用其中定义的函数和类。在这个特定的例子中,两个源文件 mpc_planner_ros.cppmpc_planner.cpp 将被编译成 mpc_ros 这个库。通常,这个库将包含用于运动规划(可能是模型预测控制,MPC)的功能代码,使得其他ROS节点或C++应用程序可以重用这些功能。

       2、TARGET_LINK_LIBRARIES

    TARGET_LINK_LIBRARIES(mpc_ros ipopt ${catkin_LIBRARIES} )
    
    • 1

       - 作用:这个指令用于指定链接目标库 mpc_ros 到其他库,包括 ipoptcatkin_LIBRARIES。这是为了确保在编译和链接过程中,mpc_ros 能够访问这些库的功能和符号。

       - 原理:在CMake中,TARGET_LINK_LIBRARIES 用于将目标库与其他库进行链接。在这里,mpc_ros 库将与 ipoptcatkin_LIBRARIES 进行链接,这使得 mpc_ros 可以使用这些库提供的功能。ipopt 通常是一个优化库,而 catkin_LIBRARIES 是与ROS相关的库集合,其中包括ROS核心库和其他可能需要的ROS库。这些库的链接将允许 mpc_ros 在运行时调用它们的函数和符号。

       3、add_dependencies

    add_dependencies(mpc_ros ${${PROJECT_NAME}_EXPORTED_TARGETS})
    
    • 1

       - 作用:这个指令指定了 mpc_ros 库的依赖关系,以确保在构建项目时,mpc_ros 会在 ${PROJECT_NAME}_EXPORTED_TARGETS 目标之前被构建。

       - 原理:在CMake中,add_dependencies 用于定义构建目标之间的依赖关系。在这个特定的情况下,mpc_ros 库依赖于 ${PROJECT_NAME}_EXPORTED_TARGETS 目标。这意味着在构建项目时,CMake 将确保先构建 ${PROJECT_NAME}_EXPORTED_TARGETS,然后才构建 mpc_ros。通常,${PROJECT_NAME}_EXPORTED_TARGETS 包括了需要在 mpc_ros 使用的其他目标,例如ROS节点或其他库,以确保这些目标已经构建完成并且可用。


       这些指令的目的是协助构建ROS项目中的库,以便它们能够被其他项目正确链接和使用所需的依赖项。这有助于管理复杂的ROS工程和C++工程的构建过程,并确保各个部分正确协作。


  • 相关阅读:
    微信支付APIV3统一回调接口封装(H5、JSAPI、H5、App、小程序)
    openEuler 系统操作 Docker Compose 容器化部署 Redis Cluster 集群的节点添加、删除和可视化监控
    unity工程参照以及评价(B)
    重温C语言八----程序流程控制
    多维表格平台盘点 Notion、FlowUs、Airtable、SeaTable、Vika
    计算机毕设(附源码)JAVA-SSM基于的优质房源房租管理系统
    1997-2020年各省三废排放量和熵值法计算的环境规制综合指数(无缺失值)
    算法通关村第16关【青铜】| 滑动窗口思想
    良心安利万向轮 SolidWorks模型素材网站
    CGAL 模运算
  • 原文地址:https://blog.csdn.net/qq_44339029/article/details/133941132