问题描述:
- 最近使用源码编译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
,编译也能成功;