解决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,编译也能成功;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章