Symbol lookup error

런치파일을 구동하는데 아래와 같은 에러가 나타났다.

/home/as06047/catkin_ws/devel/lib/<ros-pkg>/mpc_test_node: symbol lookup error: /home/as06047/catkin_ws/devel/lib/<ros-pkg>/mpc_test_node: undefined symbol: _ZN6sh_mpc10MpcWrapperIdE7prepareEv

패키지 명은 <ros-pkg>로 가렸다.

이러한 에러가 나는 이유는 catkin build로 빌드할 당시에 아래와 같은 Warning을 무시하였기 때문이다.

Warning: Cannot symlink from /home/as06047/catkin_ws/devel/.private/<ros-pkg>/lib/libmpc_wrapper.so to existing file /home/as06047/catkin_ws/devel/lib/libmpc_wrapper.so
Warning: Source hash: e81fcac9c55e96c4c50ac4a7dbc52757
Warning: Dest hash: 8f3bcf621ec982c1b5ab83ae8c992e0e

같은 이름을 가진 라이브러리가 여러 개이기 때문에 충돌이 난 것이 원인이다.

즉, CMakeLists.txt에서 아래와 같은 내용이 여러 패키지에 존재하는 것이다.

cs_add_library(mpc_wrapper
	src/mpc_wrapper.cpp)

그렇게 되면 처음 빌드 된 파일만 libmpc_wrapper.so로 생성되고 이후의 것들은 제대로 링크가 연결되지 않는다.(처음 것으로 되는 건지 나중 것이 덮어씌우는지는 정확하지 않다.)

find /home/as06047/catkin_ws -name "libmpc_wrapper.so"
/home/as06047/catkin_ws/devel/.private/<ros-pkg-1>/lib/libmpc_wrapper.so
/home/as06047/catkin_ws/devel/.private/<ros-pkg-2>/lib/libmpc_wrapper.so
/home/as06047/catkin_ws/devel/.private/<ros-pkg-3>/lib/libmpc_wrapper.so
/home/as06047/catkin_ws/devel/lib/libmpc_wrapper.so

나 같은 경우에는 3가지의 패키지에 같은 내용이 있었고 2번째 패키지 외의 패키지에서 해당 헤더파일을 포함한 노드를 사용할 때 사용할 수 없었다.

해결법

우선 .private/<ros-pkg>/lib/libmpc_wrapper.so를 모두 직접 지워준다.

즉, 겹치는 라이브러리 파일들을 모두 제거한다.

그 후에는 CMakeLists.txtcs_add_library 부분의 라이브러리 이름을 각각 다르게 수정해준다.

아마도 catkin_simple을 사용해서 발생하는 문제일 수도 있을 것 같다.