系統(tǒng)里面裝了Anaconda又裝了ros,執(zhí)行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
查到了這篇講的很詳細(xì)的參考:Anaconda:python3與moveit假残!的兼容問題,按照它里面的操作一步一步來拉庵。
首先查看系統(tǒng)中使用的curl:
curl -V
which curl
然后再看下ros要求使用的是哪一個:
ldd /opt/ros/kinetic/lib/libresource_retriever.so | grep curl
誒射沟,檢查發(fā)現(xiàn),ros要用的是系統(tǒng)里的登颓,但是現(xiàn)在默認(rèn)的是anaconda里面的搅荞。那怎么搞?
那篇文章提供的解決方案是把a(bǔ)naconda中的curl卸載掉框咙,操作起來比較麻煩咕痛,而且還讓人擔(dān)心其它地方會不會有依賴,產(chǎn)生潛在未知的問題喇嘱。
有沒有更簡單點的方法呢茉贡?還真有。
因為我們裝完anaconda后每次打開terminal都是自動激活anaconda里的base environment的者铜,很多設(shè)置都是跟著這個base environment來的腔丧。所以,conda deactivate
一下就行了作烟!這時候再去執(zhí)行which curl
就會發(fā)現(xiàn)愉粤,它指向系統(tǒng)中的版本了,再去編譯就不再報錯了拿撩。對了衣厘,這里在catkin_make
前要記得刪一下之前生成的CMakeLists.txt
文件和build、devel文件夾压恒,讓它重新編譯影暴,否則還會有報錯信息。
如果不想每次都執(zhí)行conda deactivate
的話探赫,就執(zhí)行下面這句型宙,
conda config --set auto_activate_base false
取消base environment的自動激活就好啦!
如果想要卸載curl的話伦吠,StackOverflow這里的討論提供了非常詳細(xì)的重定向鏈接的操作:CHENJIAN's answer妆兑。