Robotics StackExchange | Archived questions

Undefined reference to ros functions

Hi everyone, I have some trouble with CMakeList and implementing header files. It fails to compile and returns that all implemented ros functions have undefined references. I have followed 2 tutorials on how to add a header file and looked at similar posts only, but I still get the same error. The way I structured my files is as follows: driverbotcpp/src/Sensors/rplidarnode.cpp and driverbotcpp/src/include/driverbotcpp/rplidarnode.h Does someone know what's wrong? Thanks in advance! My rplidar_node.h file:

#pragma once
#include <ros/ros.h>
#include "sensor_msgs/LaserScan.h"
#include "driver_bot_cpp/lidar.h"
#include <vector>

class RPLidar
{
    public:
        RPLidar();

        //General Sensor Functions
        void read(const sensor_msgs::LaserScan::ConstPtr &msg);
        void validate();
        void run();

        //Support Functions
        void distanceCallback(const sensor_msgs::LaserScan::ConstPtr &msg);
        void angleCallback(const sensor_msgs::LaserScan::ConstPtr &msg);
        void publishValidatedData();

        ~RPLidar(){};

    private:
    //init node
        ros::NodeHandle m_node; //create a node handle

    //defining variables
        std::vector<float> m_dist;
        double m_angleIncrement;
        ros::Subscriber m_subLidar;
        ros::Publisher m_pubValData;
};

rplidar_node.cpp file code:

#include "driver_bot_cpp/rplidar_node.h"


RPLidar::RPLidar()
: m_dist{0}, m_angleIncrement{1}
{

    m_subLidar = m_node.subscribe("scan", 10, &RPLidar::read, this);
    m_pubValData = m_node.advertise<driver_bot_cpp::lidar>("rplidar", 10);
}

//General Sensor Functions
void RPLidar::read(const sensor_msgs::LaserScan::ConstPtr &msg)
{
    distanceCallback(msg);
    angleCallback(msg);
    validate();
}


void RPLidar::validate()
{
    if (m_dist[0] == 20)
    {
        std::cout << "[ERROR] DISTANCE HAS NOT BEEN RECEIVED" << std::endl;
    }
    if (m_angleIncrement == 1)
    {
        std::cout << "[ERROR] ANGLE_INCREMENT HAS NOT BEEN RECEIVED" << std::endl;
    }
}



//Support Functions
void RPLidar::distanceCallback(const sensor_msgs::LaserScan::ConstPtr &msg)
{
    m_dist = msg -> ranges;
}

void RPLidar::angleCallback(const sensor_msgs::LaserScan::ConstPtr &msg)
{
    m_angleIncrement = msg -> angle_increment;
}

void RPLidar::publishValidatedData()
{
    driver_bot_cpp::lidar msg;
    msg.distance = m_dist;
    msg.angle_increment = m_angleIncrement;
    m_pubValData.publish(msg)
}

void RPLidar::run()
{
    ros::Rate rate (10);

    while (ros::ok())
    {
        publishValidatedData();
        rate.sleep();
    }
}

int main(int argc, char **argv)
{   
    ros::init(argc, argv, "Distance"); //initialize node


    return 0;
}

CMAKEFILE:

  cmake_minimum_required(VERSION 3.0.2)
  project(driver_bot_cpp)

  find_package(catkin REQUIRED COMPONENTS
    roscpp
    std_msgs
    message_generation
  )


  catkin_package(
    INCLUDE_DIRS include
    LIBRARIES ${PROJECT_NAME}
    CATKIN_DEPENDS roscpp
    CATKIN_DEPENDS message_runtime
  )

  include_directories(include ${catkin_INCLUDE_DIRS})

  # set(SOURCES rplidar_node.cpp ${PROJECT_NAME}/rplidar_node.h)

  ## Generate messages in the 'msg' folder
  add_message_files(
      FILES
      ObjectAngle.msg
      lidar.msg
  )

  generate_messages(
    DEPENDENCIES
    std_msgs  # Or other packages containing msgs
  )

  add_executable(${PROJECT_NAME}_node src/Sensors/rplidar_node.cpp)
  add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

  target_link_libraries(${PROJECT_NAME}_node ${catkin_LIBRARIES})

  install(
    TARGETS ${PROJECT_NAME}
    ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
    LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
    RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION}
  )


  install(
    DIRECTORY include/${PROJECT_NAME}/
    DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
  #  FILES_MATCHING PATTERN "*.h" PATTERN "*.hpp"
  #   PATTERN ".svn" EXCLUDE
  )

  add_library(${PROJECT_NAME}
    src/Sensors/rplidar_node.cpp
  )

Beginning of error (it's quite long):

/usr/bin/ld: CMakeFiles/driver_bot_cpp_node.dir/src/Sensors/rplidar_node.cpp.o: in function `RPLidar::RPLidar()':
rplidar_node.cpp:(.text+0x88): undefined reference to `ros::NodeHandle::NodeHandle ...
/usr/bin/ld: rplidar_node.cpp:(.text+0x1a8): undefined reference to `ros::Subscriber::~Subscriber()'
/usr/bin/ld: rplidar_node.cpp:(.text+0x240): undefined reference to `ros::Publisher::~Publisher()'
/usr/bin/ld: rplidar_node.cpp:(.text+0x24c): undefined reference to `ros::Subscriber::~Subscriber()'
/usr/bin/ld: rplidar_node.cpp:(.text+0x260): undefined reference to `ros::NodeHandle::~NodeHandle()'

Asked by Qzipco on 2022-11-27 05:02:27 UTC

Comments

Answers