ROS在很多地方都与Python存在兼容问题,例如我最近所遇到的如何在python3中使用moveit_commander的问题。如果在python3中使用通过apt安装的moveit则会报错,唯一的方法就是从moveit的源代码编译。如果是只安装了ros的裸机,用python3对源代码编译是不会有任何问题的。但如果还安装了anaconda,问题就很大了。在编译的时候会出现如下的错误:
/opt/ros/kinetic/lib/libresource_retriever.so: undefined reference to `curl_easy_setopt@CURL_OPENSSL_3'
/opt/ros/kinetic/lib/libresource_retriever.so: undefined reference to `curl_easy_perform@CURL_OPENSSL_3'
/opt/ros/kinetic/lib/libresource_retriever.so: undefined reference to `curl_easy_cleanup@CURL_OPENSSL_3'
/opt/ros/kinetic/lib/libresource_retriever.so: undefined reference to `curl_global_init@CURL_OPENSSL_3'
/opt/ros/kinetic/lib/libresource_retriever.so: undefined reference to `curl_easy_init@CURL_OPENSSL_3'
/opt/ros/kinetic/lib/libresource_retriever.so: undefined reference to `curl_global_cleanup@CURL_OPENSSL_3'
collect2: error: ld returned 1 exit status
这说的是什么意思呢?意思就是在编译过程中所使用的curl与libcurl无法匹配。原本在安装ros(默认是根据官方文档中的方法安装)的过程中,curl会被安装。然后在安装anaconda的过程中又会安装一种curl,另外还有可能你自己本身也有通过源码安装curl,几种不同版本的curl之间会造成冲突。以下给出我的解决办法:
首先,查看系统所使用的curl
curl -V
which curl
如果输出以下内容,则说明当前所使用的为ros安装的那个,这样是最好的。
/usr/bin/curl
如果不是,建议请将其他地方的删掉,我的做法很粗暴,进入到输出路径,然后暴力删除。这样curl就先唯一确定了。
然后就是libcurl的问题,为了让系统所使用的libcurl与curl版本对应,我们强制所有的libcurl都指向ros要求使用的那个版本,即
/usr/lib/x86_64-linux-gnu/libcurl.so.4
可以通过如下指令查看系统所有的libcurl
locate libcurl.so
/home/yjy/anaconda2/lib/libcurl.so
/home/yjy/anaconda2/lib/libcurl.so.4
/home/yjy/anaconda2/lib/libcurl.so.4.5.0
/home/yjy/anaconda2/pkgs/libcurl-7.63.0-h20c2e04_1000/lib/libcurl.so
/home/yjy/anaconda2/pkgs/libcurl-7.63.0-h20c2e04_1000/lib/libcurl.so.4
/home/yjy/anaconda2/pkgs/libcurl-7.63.0-h20c2e04_1000/lib/libcurl.so.4.5.0
/usr/lib/x86_64-linux-gnu/libcurl.so
/usr/lib/x86_64-linux-gnu/libcurl.so.3
/usr/lib/x86_64-linux-gnu/libcurl.so.4
/usr/lib/x86_64-linux-gnu/libcurl.so.4.4.0
ros所要求使用的是哪一个呢?通过如下指令查看
ldd /opt/ros/kinetic/lib/libresource_retriever.so | grep curl
一般是输出:
libcurl.so.4 => /usr/lib/x86_64-linux-gnu/libcurl.so.4
如上是没有问题的。如果路径不对,例如:
libcurl.so.4 => /usr/local/lib/libcurl.so.4
那么将原本的原软链接删除,建立新的软连接指向/usr/lib/x86_64-linux-gnu/libcurl.so.4
sudo rm -rf /usr/local/lib/libcurl.so.4
sudo ln -s /usr/lib/x86_64-linux-gnu/libcurl.so.4 /usr/local/lib/libcurl.so.4
同理对anaconda中所有libcurl如此操作。将其暴力删除还没试过,不知道有没有效果。