es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  ,

Answer

  1. Avatar for 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:

    #ifdef ROS_NOETIC
        // código para noetic
    #else
        // código para melódico
    #endif
    

    En este ejemplo, el código dentro de las cláusulas #ifdef ROS_NOETIC y #else solo se compilará si se define la bandera ROS_NOETIC. Esta bandera se puede establecer utilizando la opción -D al compilar el código con catkin_make.

    Para establecer la bandera ROS_NOETIC, puede agregar la siguiente línea a su archivo CMakeLists.txt:

    add_definitions(-DROS_NOETIC)
    

    Esto le indicará a catkin_make que defina la bandera ROS_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.

Comments are closed.