Building go code by using CGO and SWIG fails due to dependencies to ROS

Viewed 68

I am using cgo/gccgo to compile go code that is using C++ code. The go file that uses the CGO-directives was generated by SWIG.

I've set the CGO_CXXFLAGS environment variable to respect necessary header-files requiered by the .cpp-files my go code is accessing, which seems to have worked well. But now I am at a point, where adding more include-paths to the CGO_CXXFLAGS doesn't help any more because after issuing

go build -x main.go

I am getting the errors listed at the end of this post.

Building my C++-code (without any go or SWIG) using a CMakeLists.txt file works pretty well.

I am pretty unexperienced with building C++-code and all the ROS-internals but my suspicion is that is has something to do with the dependencies mentioned in the CMakeLists.txt, such as in particular roscpp:

find_package(
    catkin REQUIRED COMPONENTS
    roscpp
    genmsg
    actionlib_msgs
    actionlib
    geographic_msgs
    geometry_msgs
    message_generation
)

because if I follow the traces through the /opt/ros/noetic/share/roscpp/package.xml (i.e. my roscpp package). I see dependencies such as

<build_depend>rosconsole</build_depend>

and so on and so forth.

One of the many errors I am getting is

undefined reference to `ros::console::initialize()'

which makes me believe that I need to tell the linker to use the package rosconsole, which seems to exist as a ROS-package in /opt/ros/noetic/share/rosconsole. The package is there and it seems that I can use it when building via the CMakeLists.txt, but how to tell the go-compiler?

That's the aforementioned point where I am currently stuck:

root@DESKTOP-V3N7TK9:/mnt/d/home/workspaces/go_swig_c/main# go build -x main.go 
WORK=/tmp/go-build645711002
mkdir -p $WORK/b002/
cd /mnt/d/home/workspaces/go_swig_c/ros_packages/src/uniform_mission_space/src/actions
TERM='dumb' CGO_LDFLAGS='"-L/opt/ros/noetic/lib"' /usr/local/go/pkg/tool/linux_amd64/cgo -objdir $WORK/b002/ -importpath easyswig/ros_packages/src/uniform_mission_space/src/actions -- -I $WORK/b002/ -g -O2 ./simple.go
cd $WORK
gcc -fno-caret-diagnostics -c -x c - -o /dev/null || true
gcc -Qunused-arguments -c -x c - -o /dev/null || true
gcc -fdebug-prefix-map=a=b -c -x c - -o /dev/null || true
gcc -gno-record-gcc-switches -c -x c - -o /dev/null || true
cd $WORK/b002
TERM='dumb' gcc -I /mnt/d/home/workspaces/go_swig_c/ros_packages/src/uniform_mission_space/src/actions -fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=$WORK/b002=/tmp/go-build -gno-record-gcc-switches -I ./ -g -O2 -o ./_x001.o -c _cgo_export.c
TERM='dumb' gcc -I /mnt/d/home/workspaces/go_swig_c/ros_packages/src/uniform_mission_space/src/actions -fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=$WORK/b002=/tmp/go-build -gno-record-gcc-switches -I ./ -g -O2 -o ./_x002.o -c simple.cgo2.c
cd $WORK
g++ -fno-caret-diagnostics -c -x c - -o /dev/null || true
g++ -Qunused-arguments -c -x c - -o /dev/null || true
g++ -fdebug-prefix-map=a=b -c -x c - -o /dev/null || true
g++ -gno-record-gcc-switches -c -x c - -o /dev/null || true
cd /mnt/d/home/workspaces/go_swig_c/ros_packages/src/uniform_mission_space/src/actions
TERM='dumb' g++ -I . -fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=$WORK/b002=/tmp/go-build -gno-record-gcc-switches -I $WORK/b002/ -std=c++11 -I/mnt/d/home/workspaces/go_swig_c/ros_packages/devel/include -I/mnt/d/home/workspaces/go_swig_c/ros_packages/src/uniform_mission_space/include -I/opt/ros/no
etic/include -o $WORK/b002/_x003.o -c UniformActionBase.cpp
TERM='dumb' g++ -I . -fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=$WORK/b002=/tmp/go-build -gno-record-gcc-switches -I $WORK/b002/ -std=c++11 -I/mnt/d/home/workspaces/go_swig_c/ros_packages/devel/include -I/mnt/d/home/workspaces/go_swig_c/ros_packages/src/uniform_mission_space/include -I/opt/ros/no
etic/include -o $WORK/b002/_x004.o -c UniformArmingAction.cpp
TERM='dumb' g++ -I . -fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=$WORK/b002=/tmp/go-build -gno-record-gcc-switches -I $WORK/b002/ -std=c++11 -I/mnt/d/home/workspaces/go_swig_c/ros_packages/devel/include -I/mnt/d/home/workspaces/go_swig_c/ros_packages/src/uniform_mission_space/include -I/opt/ros/no
etic/include -o $WORK/b002/_x005.o -c swig_wrap.cxx
cd $WORK/b002
TERM='dumb' gcc -I /mnt/d/home/workspaces/go_swig_c/ros_packages/src/uniform_mission_space/src/actions -fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=$WORK/b002=/tmp/go-build -gno-record-gcc-switches -I ./ -g -O2 -o ./_cgo_main.o -c _cgo_main.c
cd /mnt/d/home/workspaces/go_swig_c/main
TERM='dumb' g++ -I /mnt/d/home/workspaces/go_swig_c/ros_packages/src/uniform_mission_space/src/actions -fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=$WORK/b002=/tmp/go-build -gno-record-gcc-switches -o $WORK/b002/_cgo_.o $WORK/b002/_cgo_main.o $WORK/b002/_x001.o $WORK/b002/_x002.o $WORK/b002/_x003.o
 $WORK/b002/_x004.o $WORK/b002/_x005.o -L/opt/ros/noetic/lib
# easyswig/ros_packages/src/uniform_mission_space/src/actions
/usr/local/bin/ld: $WORK/b002/_x004.o: in function `ros::WallDuration::WallDuration(double)':
UniformArmingAction.cpp:(.text._ZN3ros12WallDurationC2Ed[_ZN3ros12WallDurationC5Ed]+0x32): undefined reference to `ros::DurationBase<ros::WallDuration>::fromSec(double)'
/usr/local/bin/ld: $WORK/b002/_x004.o: in function `boost::detail::thread_data_base::thread_data_base()':
UniformArmingAction.cpp:(.text._ZN5boost6detail16thread_data_baseC2Ev[_ZN5boost6detail16thread_data_baseC5Ev]+0x24): undefined reference to `vtable for boost::detail::thread_data_base'
/usr/local/bin/ld: $WORK/b002/_x004.o: in function `boost::detail::interruption_checker::interruption_checker(pthread_mutex_t*, pthread_cond_t*)':
UniformArmingAction.cpp:(.text._ZN5boost6detail20interruption_checkerC2EP15pthread_mutex_tP14pthread_cond_t[_ZN5boost6detail20interruption_checkerC5EP15pthread_mutex_tP14pthread_cond_t]+0x29): undefined reference to `boost::detail::get_current_thread_data()'
/usr/local/bin/ld: $WORK/b002/_x004.o: in function `boost::thread::start_thread()':
UniformArmingAction.cpp:(.text._ZN5boost6thread12start_threadEv[_ZN5boost6thread12start_threadEv]+0x28): undefined reference to `boost::thread::start_thread_noexcept()'
/usr/local/bin/ld: $WORK/b002/_x004.o: in function `actionlib::CommState::toString[abi:cxx11]() const':
UniformArmingAction.cpp:(.text._ZNK9actionlib9CommState8toStringB5cxx11Ev[_ZNK9actionlib9CommState8toStringB5cxx11Ev]+0x265): undefined reference to `ros::console::g_initialized'
/usr/local/bin/ld: UniformArmingAction.cpp:(.text._ZNK9actionlib9CommState8toStringB5cxx11Ev[_ZNK9actionlib9CommState8toStringB5cxx11Ev]+0x278): undefined reference to `ros::console::initialize()'
/usr/local/bin/ld: UniformArmingAction.cpp:(.text._ZNK9actionlib9CommState8toStringB5cxx11Ev[_ZNK9actionlib9CommState8toStringB5cxx11Ev]+0x309): undefined reference to `ros::console::initializeLogLocation(ros::console::LogLocation*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >
 const&, ros::console::levels::Level)'
/usr/local/bin/ld: UniformArmingAction.cpp:(.text._ZNK9actionlib9CommState8toStringB5cxx11Ev[_ZNK9actionlib9CommState8toStringB5cxx11Ev]+0x368): undefined reference to `ros::console::setLogLocationLevel(ros::console::LogLocation*, ros::console::levels::Level)'
/usr/local/bin/ld: UniformArmingAction.cpp:(.text._ZNK9actionlib9CommState8toStringB5cxx11Ev[_ZNK9actionlib9CommState8toStringB5cxx11Ev]+0x377): undefined reference to `ros::console::checkLogLocationEnabled(ros::console::LogLocation*)'
/usr/local/bin/ld: UniformArmingAction.cpp:(.text._ZNK9actionlib9CommState8toStringB5cxx11Ev[_ZNK9actionlib9CommState8toStringB5cxx11Ev]+0x3e3): undefined reference to `ros::console::print(ros::console::FilterBase*, void*, ros::console::levels::Level, char const*, int, char const*, char const*, ...)'
/usr/local/bin/ld: $WORK/b002/_x004.o: in function `actionlib::SimpleActionClient<adapter_space_pkg::ArmingAction_<std::allocator<void> > >::SimpleActionClient(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool)':
UniformArmingAction.cpp:(.text._ZN9actionlib18SimpleActionClientIN17adapter_space_pkg13ArmingAction_ISaIvEEEEC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb[_ZN9actionlib18SimpleActionClientIN17adapter_space_pkg13ArmingAction_ISaIvEEEEC5ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb]+0x81):
 undefined reference to `ros::NodeHandle::NodeHandle(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, 
std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > const&)'
/usr/local/bin/ld: UniformArmingAction.cpp:(.text._ZN9actionlib18SimpleActionClientIN17adapter_space_pkg13ArmingAction_ISaIvEEEEC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb[_ZN9actionlib18SimpleActionClientIN17adapter_space_pkg13ArmingAction_ISaIvEEEEC5ERKNSt7__cxx1112basic_stringIcSt11char_traits

[...]

UniformArmingAction.cpp:(.text._ZN3ros13serialization10SerializerIhE5writeINS0_7OStreamEEEvRT_h[_ZN3ros13serialization10SerializerIhE5writeINS0_7OStreamEEEvRT_h]+0x58): undefined reference to `ros::serialization::throwStreamOverrun()'
/usr/local/bin/ld: $WORK/b002/_x004.o:(.data.rel.ro._ZTIN5boost6detail11thread_dataINS_3_bi6bind_tIvNS_4_mfi3mf0IvN9actionlib18SimpleActionClientIN17adapter_space_pkg13ArmingAction_ISaIvEEEEEEENS2_5list1INS2_5valueIPSC_EEEEEEEE[_ZTIN5boost6detail11thread_dataINS_3_bi6bind_tIvNS_4_mfi3mf0IvN9actionlib18SimpleAct
y_ISaIvEEEEEvE11deserializeERKNS_43SubscriptionCallbackHelperDeserializeParamsE]+0xcb): undefined reference to `ros::console::initializeLogLocation(ros::console::LogLocation*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::console::levels::Level)'
/usr/local/bin/ld: UniformArmingAction.cpp:(.text._ZN3ros27SubscriptionCallbackHelperTIRKNS_12MessageEventIKN14actionlib_msgs16GoalStatusArray_ISaIvEEEEEvE11deserializeERKNS_43SubscriptionCallbackHelperDeserializeParamsE[_ZN3ros27SubscriptionCallbackHelperTIRKNS_12MessageEventIKN14actionlib_msgs16GoalStatusArra
y_ISaIvEEEEEvE11deserializeERKNS_43SubscriptionCallbackHelperDeserializeParamsE]+0x10e): undefined reference to `ros::console::setLogLocationLevel(ros::console::LogLocation*, ros::console::levels::Level)'
/usr/local/bin/ld: UniformArmingAction.cpp:(.text._ZN3ros27SubscriptionCallbackHelperTIRKNS_12MessageEventIKN14actionlib_msgs16GoalStatusArray_ISaIvEEEEEvE11deserializeERKNS_43SubscriptionCallbackHelperDeserializeParamsE[_ZN3ros27SubscriptionCallbackHelperTIRKNS_12MessageEventIKN14actionlib_msgs16GoalStatusArra
y_ISaIvEEEEEvE11deserializeERKNS_43SubscriptionCallbackHelperDeserializeParamsE]+0x11d): undefined reference to `ros::console::checkLogLocationEnabled(ros::console::LogLocation*)'
/usr/local/bin/ld: UniformArmingAction.cpp:(.text._ZN3ros27SubscriptionCallbackHelperTIRKNS_12MessageEventIKN14actionlib_msgs16GoalStatusArray_ISaIvEEEEEvE11deserializeERKNS_43SubscriptionCallbackHelperDeserializeParamsE[_ZN3ros27SubscriptionCallbackHelperTIRKNS_12MessageEventIKN14actionlib_msgs16GoalStatusArra
y_ISaIvEEEEEvE11deserializeERKNS_43SubscriptionCallbackHelperDeserializeParamsE]+0x1a6): undefined reference to `ros::console::print(ros::console::FilterBase*, void*, ros::console::levels::Level, char const*, int, char const*, char const*, ...)'
/usr/local/bin/ld: $WORK/b002/_x004.o: in function `void ros::serialization::Serializer<unsigned int>::read<ros::serialization::IStream>(ros::serialization::IStream&, unsigned int&)':
UniformArmingAction.cpp:(.text._ZN3ros13serialization10SerializerIjE4readINS0_7IStreamEEEvRT_Rj[_ZN3ros13serialization10SerializerIjE4readINS0_7IStreamEEEvRT_Rj]+0x57): undefined reference to `ros::serialization::throwStreamOverrun()'
/usr/local/bin/ld: $WORK/b002/_x004.o: in function `void ros::serialization::Serializer<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::read<ros::serialization::IStream>(ros::serialization::IStream&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>
 >&)':
UniformArmingAction.cpp:(.text._ZN3ros13serialization10SerializerINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE4readINS0_7IStreamEEEvRT_RS7_[_ZN3ros13serialization10SerializerINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE4readINS0_7IStreamEEEvRT_RS7_]+0x9e): undefined reference to `ros::serializ
ation::throwStreamOverrun()'
/usr/local/bin/ld: $WORK/b002/_x004.o: in function `void ros::serialization::Serializer<unsigned char>::read<ros::serialization::IStream>(ros::serialization::IStream&, unsigned char&)':
UniformArmingAction.cpp:(.text._ZN3ros13serialization10SerializerIhE4readINS0_7IStreamEEEvRT_Rh[_ZN3ros13serialization10SerializerIhE4readINS0_7IStreamEEEvRT_Rh]+0x57): undefined reference to `ros::serialization::throwStreamOverrun()'
collect2: error: ld returned 1 exit status

Please, I would really appreciate any kind of idea, since I am really stuck and need to go forward.

0 Answers
Related