Tip: type this in your shell:
c++filt _ZN3ros7console5printEPNS0_10FilterBaseEPvNS0_6levels5LevelEPKciS7_S7_z
This will allow you to see the missing symbol in human-readable format:
ros::console::print(ros::console::FilterBase*, void*, ros::console::levels::Level, char const*, int, char const*, char const*, ...)
This process is called demangling.
Now, your system is not able to find this symbol in /opt/ros/hydro/lib/libopenni_nodelet.so
or the shared libraries it's linked to. You can confirm that you don't have it in your installed ROS libraries by typing:
nm -D /opt/ros/hydro/lib/*.so | grep -i "T _ZN3ros7console5printEPNS0_10FilterBaseEPvNS0_6levels5LevelEPKciS7_S7_z"
In my case (working Hydro), I get (in /opt/ros/hydro/lib/librosconsole.so
):
0000000000016530 T _ZN3ros7console5printEPNS0_10FilterBaseEPvNS0_6levels5LevelEPKciS7_S7_z
Conclusion: there must be an error in the package (not up-to-date or missing shared library dependency). Check that you are up-to-date as advised by @ahendrix, and if the problem persists, you may want to contact the developers and/or packagers.
Update
Here's a script that can help you find a given symbol in a given library directory:
find_symbol.sh
#!/bin/sh
# First argument: library folder (e.g. /opt/ros/hydro/lib)
# Second argument: mangled symbol (e.g. _ZN3ros7console8shutdownEv)
for lib in $(find $1 -name \*.so) ; do
res=`nm -D $lib | grep $2 | grep -v " U "`
if [ ! -z "$res" ]; then
echo "$lib: $res"
fi
done
Then run (for instance):
./find_symbol.sh /opt/ros/hydro/lib _ZN3ros7console8shutdownEv
Output:
/opt/ros/hydro/lib/librosconsole.so: 0000000000015e00 T _ZN3ros7console8shutdownEv
Originally posted by bchr with karma: 596 on 2014-01-28
This answer was ACCEPTED on the original site
Post score: 5