系统里面装了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。