解决libresource_retriever.so:对‘curl_easy_init@CURL_OPENSSL_3’未定义的引用

以下方法并不能解决我的问题,我的解决方法:安装curl-7.53.0  然后修改 .bashrc 添加
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/x86_64-linux-gnu 
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

问题描述:
最近使用源码编译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
1
得到了ros使用的libcurl版本:

libcurl.so.4 => /usr/lib/x86_64-linux-gnu/libcurl.so.4 (0x00007fd7218fd000)
1
接下来我们要将所有的libcurl库指向这个版本:
先locate所有的libcurl:

locate libcurl.so
1
输出:

/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
1

可以看出除了系统/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,编译也能成功;

你可能感兴趣的:(ROS)