問題描述:
- 最近使用源碼編譯move it!包的時候遇上如下問題:
/opt/ros/kinetic/lib/libresource_retriever.so:對‘curl_easy_init@CURL_OPENSSL_3’未定義的引用
/opt/ros/kinetic/lib/libresource_retriever.so:對‘curl_easy_perform@CURL_OPENSSL_3’未定義的引用
/opt/ros/kinetic/lib/libresource_retriever.so:對‘curl_easy_setopt@CURL_OPENSSL_3’未定義的引用
/opt/ros/kinetic/lib/libresource_retriever.so:對‘curl_easy_cleanup@CURL_OPENSSL_3’未定義的引用
......
- 網上找了無數篇博文,終於有一篇解決了我的問題:參考博文
問題定義:
- 該問題是ROS和Anaconda的兼容問題導致的,意思就是在編譯過程中所使用的curl與libcurl無法匹配。原本在安裝ros(默認是根據官方文檔中的方法安裝)的過程中,curl會被安裝。然後在安裝anaconda的過程中又會安裝一種curl,另外還有可能你自己本身也有通過源碼安裝curl,幾種不同版本的curl之間會造成衝突。
問題解決:
- 首先,查看系統所使用的curl
which curl
- 如果輸出
/usr/bin/curl
,則說明當前所使用的爲ros安裝的那個,如果輸出~/anaconda3/bin/curl
,則說明使用的是conda安裝的,這裏經過測試,更改系統使用的curl爲ros安裝的那個並不能消除錯誤。
有效的解決方法:強制所有的libcurl都指向ros要求使用的那個版本
-
首先我們查看出現問題的庫文件
libresource_retriever.so
:ldd /opt/ros/kinetic/lib/libresource_retriever.so | grep curl
得到了ros使用的libcurl版本:
libcurl.so.4 => /usr/lib/x86_64-linux-gnu/libcurl.so.4 (0x00007fd7218fd000)
-
接下來我們要將所有的libcurl庫指向這個版本:
先locate所有的libcurl:locate libcurl.so
輸出:
/home/ct/anaconda3/lib/libcurl.so /home/ct/anaconda3/lib/libcurl.so.4 /home/ct/anaconda3/lib/libcurl.so.4.5.0 /home/ct/anaconda3/pkgs/libcurl-7.63.0-h20c2e04_1000/lib/libcurl.so /home/ct/anaconda3/pkgs/libcurl-7.63.0-h20c2e04_1000/lib/libcurl.so.4 /home/ct/anaconda3/pkgs/libcurl-7.63.0-h20c2e04_1000/lib/libcurl.so.4.5.0 /home/ct/anaconda3/pkgs/libcurl-7.64.0-h20c2e04_2/lib/libcurl.so /home/ct/anaconda3/pkgs/libcurl-7.64.0-h20c2e04_2/lib/libcurl.so.4 /home/ct/anaconda3/pkgs/libcurl-7.64.0-h20c2e04_2/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
可以看出除了系統
/usr/lib/x86_64-linux-gnu/
下的libcurl庫,還有anaconda下的libcurl庫;列出anaconda下的libcurl庫,可以看出
libcurl.so.4
指向的是libcurl.so.4.5.0
版本(可能這就是不兼容的地方):$ ll /home/ct/anaconda3/lib |grep libcurl -rw-rw-r-- 1 ct ct 1147598 11月 28 09:09 libcurl.a lrwxrwxrwx 1 ct ct 16 11月 28 09:09 libcurl.so -> libcurl.so.4.5.0* lrwxrwxrwx 1 root root 42 11月 29 14:15 libcurl.so.4 -> libcurl.so.4.5.0* -rwxrwxr-x 1 ct ct 621840 11月 28 09:09 libcurl.so.4.5.0*
直接刪除
libcurl.so.4
,將libcurl.so.4
指向ros使用的版本/usr/lib/x86_64-linux-gnu/libcurl.so.4
:cd ~/anaconda3/lib sudo rm libcurl.so.4 sudo ln -s /usr/lib/x86_64-linux-gnu/libcurl.so.4.4.0 libcurl.so.4
再進行編譯,錯誤消失
總結
- 本文僅僅針對對
/home/ct/anaconda3/lib/
下的libcurl庫文件的鏈接進行了更改,沒有對/home/ct/anaconda3/pkgs/libcurl-7.63.0-h20c2e04_1000/lib/
目錄下的libcurl進行操作,編譯也能成功; - 沒有改變系統默認的curl,即默認的curl指向的是
~/anaconda3/bin/curl
,編譯也能成功;