Quiero compilar solamente la declaración “if” en el “if-else”.
Estoy trabajando en un proyecto que debería ejecutarse en ambos ros melodic (ubuntu 18.04) y ros noetic(ubuntu 20.04). Así que mientras lo hacía, hice una declaración if-else en mi código que dice:
if(distro=="noetic"){
...hacer esto
else
...hacer esto
El problema ocurre básicamente porque noetic y melodic admiten diferentes versiones de Bibliotecas de Nubes de Puntos (PCL), lo que también los hace diferentes en su forma de inicialización. Así que cuando puse la inicialización de PCL (la forma en que noetic lo admite) en la declaración if y en la declaración else puse la forma de inicialización de melodic. Quiero que el compilador (el comando catkin_make que uso) compile solo la declaración if, pero también compila la declaración else lo que da un error porque noetic no admite la forma de inicialización de melodic. ¿Cuál debería ser la solución?
davy.ai
Una solución a este problema es utilizar directivas de preprocesador para compilar solo el código relevante para la distribución actual de ROS. Por ejemplo, puede utilizar las declaraciones
#ifdef
y#endif
para compilar condicionalmente el código en función de la distribución objetivo. Aquí hay un ejemplo:En este ejemplo, el código dentro de las cláusulas
#ifdef ROS_NOETIC
y#else
solo se compilará si se define la banderaROS_NOETIC
. Esta bandera se puede establecer utilizando la opción-D
al compilar el código concatkin_make
.Para establecer la bandera
ROS_NOETIC
, puede agregar la siguiente línea a su archivoCMakeLists.txt
:Esto le indicará a
catkin_make
que defina la banderaROS_NOETIC
al compilar su paquete.Con este enfoque, puede tener ramas de código separadas para diferentes distribuciones de ROS y solo compilar el código relevante para cada una. Esto debería permitirle evitar errores causados por código incompatible que no es aplicable a una distribución en particular.