ROS Answers: Open Source Q&A Forum - RSS feedhttps://answers.ros.org/questions/Open source question and answer forum written in Python and DjangoenROS Answers is licensed under Creative Commons Attribution 3.0Fri, 25 Sep 2020 09:20:33 -0500[ROS2] Including a cpp header from another packagehttps://answers.ros.org/question/362345/ros2-including-a-cpp-header-from-another-package/ Dear fellow developers: I am a beginner in ROS2. I have designed a library that I want all packages in ROS2 to have access. This is the warning I get when I try to build. This is causing an error. CMake Warning at /home/jetson/ros2_ws/install/library_pkg/share/library_pkg/cmake/ament_cmake_export_libraries-extras.cmake:116 (message): Package 'library_pkg' exports library 'export_library_pkg' which couldn't be found Call Stack (most recent call first): /home/jetson/ros2_ws/install/library_pkg/share/library_pkg/cmake/library_pkgConfig.cmake:38 (include) CMakeLists.txt:21 (find_package) This is my CMakelist cmake_minimum_required(VERSION 3.5) project(library_pkg) # Default to C++14 if(NOT CMAKE_CXX_STANDARD) set(CMAKE_CXX_STANDARD 14) endif() if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") add_compile_options(-Wall -Wextra -Wpedantic) endif() # find dependencies find_package(ament_cmake REQUIRED) find_package(rclcpp REQUIRED) find_package(cv_bridge REQUIRED) find_package(sensor_msgs REQUIRED) find_package(image_transport REQUIRED) find_package(std_msgs REQUIRED) # Try for OpenCV 4.X, but settle for whatever is installed find_package(OpenCV 4 QUIET) if (NOT OpenCV_FOUND) find_package(OpenCV REQUIRED) endif () message(STATUS "Found OpenCV version ${OpenCV_VERSION}") # Package includes not needed for CMake >= 2.8.11 include_directories( include ${colcon_INCLUDE_DIRS} ${OpenCV_INCLUDE_DIRS} ) add_library( ${PROJECT_NAME} SHARED src/CameraCapture.cpp src/MJPEGWriter.cpp src/CameraMainNode.cpp ) target_include_directories(${PROJECT_NAME} PUBLIC "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>" "$<INSTALL_INTERFACE:include>") ament_target_dependencies( ${PROJECT_NAME} image_transport OpenCV rclcpp sensor_msgs std_msgs ) ament_export_include_directories(include) ament_export_libraries(export_${PROJECT_NAME}) #============= # Install #============= install( DIRECTORY include/ DESTINATION include ) install( TARGETS ${PROJECT_NAME} EXPORT export_${PROJECT_NAME} LIBRARY DESTINATION lib ARCHIVE DESTINATION lib RUNTIME DESTINATION bin INCLUDES DESTINATION include ) ament_package() The error that it is causing > undefined reference The full error CMakeFiles/camera_capture.dir/src/CameraMain.cpp.o: In function `main': CameraMain.cpp:(.text+0x224): undefined reference to `CameraCapture::CameraCapture()' CameraMain.cpp:(.text+0x2bc): undefined reference to `void CameraCapture::Capture<std::shared_ptr<CameraNode> >(std::shared_ptr<CameraNode>, image_transport::Publisher, int, int, int, int, int, int)' CameraMain.cpp:(.text+0x378): undefined reference to `CameraCapture::~CameraCapture()' CameraMain.cpp:(.text+0x47c): undefined reference to `CameraCapture::~CameraCapture()' collect2: error: ld returned 1 exit status make[2]: *** [camera_capture] Error 1 make[1]: *** [CMakeFiles/camera_capture.dir/all] Error 2 make: *** [all] Error 2 This is the CMakelist on the package that include the library project(camera_pkg) # Default to C++14 if(NOT CMAKE_CXX_STANDARD) set(CMAKE_CXX_STANDARD 14) endif() if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") add_compile_options(-Wall -Wextra -Wpedantic) endif() # find dependencies find_package(ament_cmake REQUIRED) find_package(rclcpp REQUIRED) find_package(image_transport REQUIRED) find_package(OpenCV REQUIRED) find_package(std_msgs REQUIRED) find_package(sensor_msgs REQUIRED) find_package(library_pkg REQUIRED) # Try for OpenCV 4.X, but settle for whatever is installed find_package(OpenCV 4 QUIET) if (NOT OpenCV_FOUND) find_package(OpenCV REQUIRED) endif () message(STATUS "Found OpenCV version ${OpenCV_VERSION}") add_executable(camera_capture src/CameraMain.cpp) ament_target_dependencies(camera_capture rclcpp image_transport OpenCV std_msgs sensor_msgs library_pkg) ament_export_dependencies(rclcpp image_transport OpenCV std_msgs sensor_msgs library_pkg) install(TARGETS DESTINATION lib/${PROJECT_NAME} ) ament_package() I am not sure what I am doing wrong. I would appricate any help or guidance. MajedFri, 25 Sep 2020 09:20:33 -0500https://answers.ros.org/question/362345/Actionlib Tutorials: cmake can't find Action.h filehttps://answers.ros.org/question/312745/actionlib-tutorials-cmake-cant-find-actionh-file/Hi, I'm getting started learning actionlib, and have the example from the tutorials working just fine, and I thought I understood it pretty well. I'm trying to implement a second server (Called counter_server, based on a Counter.action file) so I can learn it better, and am having some trouble. Quick note, running ROS melodic in ubuntu 18.04 in a VMware VM. When compiling, this is the error I get: /home/*me*/catkin_ws/src/actionlib_tutorials/src/counter_server.cpp:3:10: fatal error: actionlib_tutorials/CounterAction.h: No such file or directory #include <actionlib_tutorials/CounterAction.h> ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ compilation terminated. actionlib_tutorials/CMakeFiles/counter_server.dir/build.make:62: recipe for target 'actionlib_tutorials/CMakeFiles/counter_server.dir/src/counter_server.cpp.o' failed make[2]: *** [actionlib_tutorials/CMakeFiles/counter_server.dir/src/counter_server.cpp.o] Error 1 CMakeFiles/Makefile2:481: recipe for target 'actionlib_tutorials/CMakeFiles/counter_server.dir/all' failed make[1]: *** [actionlib_tutorials/CMakeFiles/counter_server.dir/all] Error 2 Makefile:140: recipe for target 'all' failed make: *** [all] Error 2 Invoking "make -j1 -l1" failed I suspect some sort of a cmake error. This is all of my CMakeLists: cmake_minimum_required(VERSION 2.8.3) project(actionlib_tutorials) find_package(catkin REQUIRED COMPONENTS actionlib actionlib_msgs message_generation roscpp rospy std_msgs ) add_action_files( DIRECTORY action FILES Counter.action Fibonacci.action ) generate_messages( DEPENDENCIES actionlib_msgs std_msgs ) catkin_package( CATKIN_DEPENDS actionlib_msgs ) include_directories( include ${catkin_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS} ) add_executable(fibonacci_server src/fibonacci_server.cpp) target_link_libraries( fibonacci_server ${catkin_LIBRARIES} ) add_dependencies( fibonacci_server ${fibonacci_server_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS} ) add_executable(counter_server src/counter_server.cpp) target_link_libraries( counter_server ${catkin_LIBRARIES} ) add_dependencies( counter_server ${counter_server_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS} ) This is the code in counter_server.cpp, but it seems like pretty straightforward C++ and is extremely similar to the code from the tutorial. #include <ros/ros.h> #include <actionlib/server/simple_action_server.h> #include <actionlib_tutorials/CounterAction.h> class CounterAction{ protected: ros::NodeHandle nh_; actionlib::SimpleActionServer<actionlib_tutorials::CounterAction> as_; std::string action_name_; actionlib_tutorials::CounterFeedback feedback_; actionlib_tutorial::CounterResult result_ public: CounterAction(std::string name): as_(nh, name, boost::bind(&FibonacciAction::executeCB, this, 1),false), action_name_(name){ as_.start(); } ~FibonacciAction(void){} void executeCB(const actionlib_tutorials::CounterGoalConstPtr& goal){ ros::Rate r(1); bool success = true; int sum = 0; ROS_INFO("Starting counter"); for(int i = 0; i < goal->maxVal; ++i){ if(as_.isPreeptRequested() || !ros::ok()){ ROS_INFO("Preempted"); as_.setPreempted; success = false; break; } sum += i; feedback_.currentVal = i; as_.publishFeedback(feedback_); r.sleep(); } if(success){ result_.sum = sum; ROS_INFO("yay did a count"); as_.setSucceeded(result_); } } }; int main(int arcg, char** argv){ ros::init(argc, argv, "counter"); CounterAction counter("counter"); ros::spin(); return 0; } ) I hope you can help! Thanks!sethgiMon, 14 Jan 2019 22:38:57 -0600https://answers.ros.org/question/312745/Undefined reference error despite linking the libraryhttps://answers.ros.org/question/195184/undefined-reference-error-despite-linking-the-library/Hi, I am using ROS Hydro on Ubuntu 12.04. I have a package named as libbarrett_ros. The declaration of the class **arm_interface** is in include/barrett_arm.h and the definition is in src/barrett_arm.cpp. The executable node (src/libbarrett_ros.cpp) creates an instance of the class barrett_arm_interface in its main function. However, catkin_make returns the following error for me, Linking CXX executable /home/robot/catkin_ws/devel/lib/libbarrett_ros/libbarrett_ros CMakeFiles/libbarrett_ros.dir/src/libbarrett_ros.cpp.o: In function `int wam_main<3u>(int, char**, barrett::ProductManager&, barrett::systems::Wam<3u>&)': libbarrett_ros.cpp:(.text._Z8wam_mainILj3EEiiPPcRN7barrett14ProductManagerERNS2_7systems3WamIXT_EEE[int wam_main<3u>(int, char**, barrett::ProductManager&, barrett::systems::Wam<3u>&)]+0x14): undefined reference to `barrett_arm_interface<3u>::barrett_arm_interface()' CMakeFiles/libbarrett_ros.dir/src/libbarrett_ros.cpp.o: In function `int wam_main<4u>(int, char**, barrett::ProductManager&, barrett::systems::Wam<4u>&)': libbarrett_ros.cpp:(.text._Z8wam_mainILj4EEiiPPcRN7barrett14ProductManagerERNS2_7systems3WamIXT_EEE[int wam_main<4u>(int, char**, barrett::ProductManager&, barrett::systems::Wam<4u>&)]+0x14): undefined reference to `barrett_arm_interface<4u>::barrett_arm_interface()' CMakeFiles/libbarrett_ros.dir/src/libbarrett_ros.cpp.o: In function `int wam_main<7u>(int, char**, barrett::ProductManager&, barrett::systems::Wam<7u>&)': libbarrett_ros.cpp:(.text._Z8wam_mainILj7EEiiPPcRN7barrett14ProductManagerERNS2_7systems3WamIXT_EEE[int wam_main<7u>(int, char**, barrett::ProductManager&, barrett::systems::Wam<7u>&)]+0x14): undefined reference to `barrett_arm_interface<7u>::barrett_arm_interface()' collect2: ld returned 1 exit status make[2]: *** [/home/robot/catkin_ws/devel/lib/libbarrett_ros/libbarrett_ros] Error 1 make[1]: *** [libbarrett_ros/CMakeFiles/libbarrett_ros.dir/all] Error 2 make: *** [all] Error 2 Invoking "make" failed I know that this is a problem with linking the barrett_arm with my executable node. I have added the barrett_arm.cpp and linked the target against my executable node. But that does not solve the problem either. Please let me know what I am missing here. Thanks in advance. My CMakeLists.txt is as below cmake_minimum_required(VERSION 2.8.3) project(libbarrett_ros) find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs message_generation ) find_package(Barrett REQUIRED) find_package(Eigen REQUIRED) catkin_package( INCLUDE_DIRS include CATKIN_DEPENDS message_runtime wam_msgs LIBRARIES ${PROJECT_NAME} ) include_directories(include ${catkin_INCLUDE_DIRS} ) link_directories(${BARRETT_LIB_DIRS}) include_directories(${BARRETT_INCLUDE_DIRS}) add_definitions(${BARRETT_DEFINITIONS}) add_library(barrett_arm src/barrett_arm.cpp) target_link_libraries(barrett_arm ${catkin_LIBRARIES} ${BARRETT_LIBRARIES}) add_executable(${PROJECT_NAME} src/libbarrett_ros.cpp) target_link_libraries(${PROJECT_NAME} barrett_arm ${catkin_LIBRARIES} ${BARRETT_LIBRARIES}) add_dependencies(${PROJECT_NAME} ${catkin_EXPORTED_TARGETS} wam_msgs_gencpp) mhariharasudanThu, 16 Oct 2014 17:38:14 -0500https://answers.ros.org/question/195184/