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