在ros項目編譯的過程中,有時會出現/usr/lib/x86_64-linux-gnu/libapr-1.so.0: undefined reference to `uuid_generate@UUID_1.0’的錯誤。經查找原因發現是都是由於ros和anaconda的兼容問題引起的,ros編譯出現這種錯誤均可用該套路解決。
問題解決過程:
1、從報錯中提取兩個關鍵字:這裏爲libapr-1.so.0和uuid
2、查找以上兩個庫在電腦中的位置:
locate libapr-1.so.0
顯示結果
/usr/lib/x86_64-linux-gnu/libapr-1.so.0
3、查看該庫對第二個關鍵字的依賴包的位置
ldd /usr/lib/x86_64-linux-gnu/libapr-1.so.0 |grep uuid
顯示結果
libuuid.so.1 => /lib/x86_64-linux-gnu/libuuid.so.1 (0x00007f7a01fd0000)
4、locate第二個關鍵字屬於的庫:
locate libuuid.so.1
顯示結果
/home/xxx/anaconda3/lib/libuuid.so.1
/home/XXX/anaconda3/lib/libuuid.so.1.0.0
/home/XXX/anaconda3/pkgs/libuuid-1.0.3-h1bed415_2/lib/libuuid.so.1
/home/XXX/anaconda3/pkgs/libuuid-1.0.3-h1bed415_2/lib/libuuid.so.1.0.0
/home/XXX/research/projects/libuuid-1.0.3/.libs/libuuid.so.1
/home/XXX/research/projects/libuuid-1.0.3/.libs/libuuid.so.1.0.0
/lib/x86_64-linux-gnu/libuuid.so.1
/lib/x86_64-linux-gnu/libuuid.so.1.3.0
這些就是第二個關鍵字的庫的所有位置,我們想讓ros使用系統的庫/lib/x86_64-linux-gnu/libuuid.so.1,但是由於anaconda的存在,使用的卻是/home/XXX/anaconda3/lib/libuuid.so.1
可以分別查看這兩種庫使用的版本:
$ ll /lib/x86_64-linux-gnu/ |grep uuid
顯示結果
lrwxrwxrwx 1 root root 20 12月 15:25libuuid.so.1 -> libuuid.so.1.3.0
-rw-r--r-- 1 root root 18976 20 12月 15:25 libuuid.so.1.3.0
$ ll /home/XXX/anaconda3/lib/ |grep uuid
可以看出系統庫使用的實際是1.3.0版本,而anaconda使用的是1.0.0版本
5、最後一步就是把anaconda中的庫鏈接到系統的庫(這種方法不一定是最好的,但是比較簡單)
sudo rm /home/xxx/anaconda3/lib/libuuid.so.1
sudo ln -s /lib/x86_64-linux-gnu/libuuid.so.1 /home/ct/anaconda3/lib/libuuid.so.1
最後發現conda命令也可以使用,ros工程也編譯通過,完美。
感謝博主:https://www.codeleading.com/article/87512571131/