如何让catkin_make仅编译if-else中对应ROS版本的代码分支
问题根源
你原来使用的是运行时逻辑判断,编译器会对所有分支的代码做语法校验、依赖解析,和运行时是否执行无关,所以不符合当前环境的分支代码也会触发编译错误。需要改用编译期条件分支实现按需编译。
实现步骤
步骤1:在CMakeLists.txt中添加ROS版本检测与宏定义
在项目的CMakeLists.txt中添加如下逻辑,根据当前环境的ROS版本定义全局编译宏:
find_package(catkin REQUIRED COMPONENTS roscpp) # 读取系统自带的ROS版本环境变量 if($ENV{ROS_DISTRO} STREQUAL "noetic") add_definitions(-DROS_DISTRO_NOETIC) elseif($ENV{ROS_DISTRO} STREQUAL "melodic") add_definitions(-DROS_DISTRO_MELODIC) endif()
步骤2:替换C++代码中的运行时if-else为预编译条件判断
将原来的运行时判断代码替换为预编译指令,只有匹配当前环境的分支代码会参与编译:
#ifdef ROS_DISTRO_NOETIC // Noetic适配的PCL初始化逻辑 ...do this #else // Melodic适配的PCL初始化逻辑 ...do this #endif
可选优化:直接检测PCL版本(适配性更强)
如果你的逻辑本质是适配不同PCL版本,也可以不用修改CMakeLists.txt,直接在C++代码中用PCL自带的版本宏做判断,兼容用户手动升级PCL的场景:
#include <pcl/pcl_config.h> // Noetic默认携带PCL 1.10+,Melodic默认携带PCL 1.8.x #if PCL_VERSION_COMPARE(>=, 1, 10, 0) // PCL 1.10及以上版本的逻辑 ...do this #else // PCL 1.9及以下版本的逻辑 ...do this #endif
内容的提问来源于stack exchange,提问作者Ab Danyia
相关产品推荐
相关产品推荐

