Anaconda和Moveit!中curl版本不同的问题

系统里面装了Anaconda又装了ros,执行catkin_make编译一个基于Moveit!的package时遇到了下面的问题:

Error Information:

/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_cleanup@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'
/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_global_init@CURL_OPENSSL_3'
collect2: error: ld returned 1 exit status
make[2]: *** [devel/lib/moveit_setup_assistant/collisions_updater] Error 1
make[1]: *** [CMakeFiles/moveit_setup_assistant_updater.dir/all] Error 2
make: *** [all] Error 2

查到了这篇讲的很详细的参考:Anaconda:python3与moveit!的兼容问题,按照它里面的操作一步一步来。

首先查看系统中使用的curl:

curl -V
which curl

然后再看下ros要求使用的是哪一个:

ldd /opt/ros/kinetic/lib/libresource_retriever.so | grep curl

诶,检查发现,ros要用的是系统里的,但是现在默认的是anaconda里面的。那怎么搞?

那篇文章提供的解决方案是把anaconda中的curl卸载掉,操作起来比较麻烦,而且还让人担心其它地方会不会有依赖,产生潜在未知的问题。

有没有更简单点的方法呢?还真有。

因为我们装完anaconda后每次打开terminal都是自动激活anaconda里的base environment的,很多设置都是跟着这个base environment来的。所以,conda deactivate一下就行了!这时候再去执行which curl就会发现,它指向系统中的版本了,再去编译就不再报错了。对了,这里在catkin_make前要记得删一下之前生成的CMakeLists.txt文件和build、devel文件夹,让它重新编译,否则还会有报错信息。

如果不想每次都执行conda deactivate的话,就执行下面这句,

conda config --set auto_activate_base false

取消base environment的自动激活就好啦!

如果想要卸载curl的话,StackOverflow这里的讨论提供了非常详细的重定向链接的操作:CHENJIAN's answer。

你可能感兴趣的:(Anaconda和Moveit!中curl版本不同的问题)