解決libresource_retriever.so:對‘curl_easy_init@CURL_OPENSSL_3’未定義的引用

問題描述:

  • 最近使用源碼編譯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要求使用的那個版本

  1. 首先我們查看出現問題的庫文件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)
    
  2. 接下來我們要將所有的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,編譯也能成功;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章