본문 바로가기
IT기술(코딩)/ros2

4일차 foxy create_subcription error LNK2019: "struct rosidl_service_type_support_t const * __cdecl rosidl_typesupport_cpp::get_service_type_support_handle

by 크리에이트매이커 2024. 2. 6.
반응형

해당 링크에러 때문에 4일동안 진도를 못나가고 있다.

 

구글의 모든  ros2문서 부터 여러 경험담을 다 읽고 시도해 보았지만 다 실패.

 

    m_tSub_setRCCmdUSV = create_subscription<station_bridge23::msg::CmdRc>("cmd_rc", 10, std::bind(&cStation_Bridge::tCallback_RCCmd, this, std::placeholders::_1));
    // // update_para
    m_sSer_setParaUSV = create_service<station_bridge23::srv::ParaUsv>("para_usv", std::bind(&cStation_Bridge::sCallback_ParaUSV, this, std::placeholders::_1, std::placeholders::_2));
    //  // download_wpts
    m_sSer_setWptsUSV = create_service<station_bridge23::srv::WptsUsv>("wpts_usv", std::bind(&cStation_Bridge::sCallback_WptsUSV, this, std::placeholders::_1, std::placeholders::_2));

    m_tPub_getStatusUSV = create_publisher<station_bridge23::msg::StatusUsv>("status_usv", 10);

    m_tPub_getStatusCON = create_publisher<station_bridge23::msg::StatusCon>("status_con", 10);

    m_tPub_getDebugUSV = create_publisher<std_msgs::msg::String>("debug_usv", 10);

    m_sCli_getReturnUSV = create_client<station_bridge23::srv::ParaUsv>("para_usv");

이 정의들을 하고 ros2에서 colcon build를 하니..

 

위 제목과 같은

station_bridge.obj : error LNK2019: "struct rosidl_service_type_support_t const * __cdecl rosidl_typesupport_cpp::get_service_type_support_handle<struct station_bridge23::srv::ParaUsv>(void)" (??$get_service_type_support_handle@UParaUsv@srv@station_bridge23@@@rosidl_typesupport_cpp@@YAPEBUrosidl_service_type_support_t@@XZ) 외부 기호(참조 위치: "public: __cdecl rclcpp::Client<struct station_bridge23::srv::ParaUsv>::Client<struct station_bridge23::srv::ParaUsv>(class rclcpp::node_interfaces::NodeBaseInterface *,class std::shared_ptr<class rclcpp::node_interfaces::NodeGraphInterface>,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,struct rcl_client_options_t &)" (??0?$Client@UParaUsv@srv@station_bridge23@@@rclcpp@@QEAA@PEAVNodeBaseInterface@node_interfaces@1@V?$shared_ptr@VNodeGraphInterface@node_interfaces@rclcpp@@@std@@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@5@AEAUrcl_client_options_t@@@Z) 함수)에서 확인하지 못했습니다. [C:\station_ws\build\station_bridge23\station_bridge.vcxproj]

 

이런 류의 에러가 저 해당 5가지 msg와 srv에 떳다.

그 어떤 라이브러리를 가져와도 저 에러는 없어지지 않는다.

 

마치 Qt5와 같은 느낌이다. 하지만 저 기능은 ros2에서 반드시 필요한 기능이라 저게 끝나야 다음을 이어갈 수 있는데,

안되서 4일째 하루 10시간넘게 뻘짓을 반복하면서 공부중이다.

 

과연 저 문제를 해결 할 수 있는 사람이 세상에 존재할지 의문이다..

 

있다면 천재겠지. 혹은 ros2 foxy를 만든사람이거나.. 아무튼 역시 빈틈이 많은 기술이다.

 

 

======================================================================================

해결했다.

ros2는 처음 하기도 하고 ros1구닥다리를 ros2를 변환하는 과정에 있어서, 기초지식에 빼먹은 부분이 있어서, 계속 일어난 에러였다. 역시 프로그램은 이상할리 없다. 내가 이상한법...

 

해결방법은 간단하지 않다.

 

일단 쉬운 방법으로 한번 패키지 빌드를 성공 시켜라.

그래가 본인 패키지 자체를 cmakelists에 적용시킬 수 있다.

 

그 뒤에 셀프 msg 와 srv를 만든다면, 반드시 cmakelists에 find_package(패키지이름 REQUIRED)

을 추가하고 똑같이 ament_target_dependencies 에도 추가해준다.

 

그리고 package.xml에

  <depend>노드이름</depend>

이렇게 반드시 추가해 주시길.

 

나머지는 구글링 하면 나오는데, 뭐

cmakelists 에는

find_package(rosidl_default_generators REQUIRED)이거

package.xml은

  <build_depend>rosidl_default_generators</build_depend>

  <exec_depend>rosidl_default_runtime</exec_depend>

  <member_of_group>rosidl_interface_packages</member_of_group

이렇게 넣으라고.. 이건 기초니까 다 알아서 하시길

그럼 즐거운 개발 !!

반응형