授人以鱼不如授人以渔,把该类问题的解决方法进行了举例,希望大家用这个套路解决相应的问题。
问题举例
libapr-1.so.0:对‘uuid_generate@UUID_1.0’未定义的引用
分析
两个关键词,libapr-1.so.0和uuid
问题定位
通过四个步骤定位该问题。
- 通过locate找到共享库的位置
locate libapr-1.so.0
得到结果
- 通过ldd找到依赖的共享库列表中uuid相关的项目
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)
如果这步骤时出现提示“no version information available”,请参考如下文章
no version information available问题解决
- 通过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
- 通过ll命令,bash中为ls -al查看两个库版本
$ ll /lib/x86_64-linux-gnu/ |grep uuid
lrwxrwxrwx 1 root root 16 10月 10 17:34 libuuid.so.1 -> libuuid.so.1.3.0
-rw-r--r-- 1 root root 18976 10月 10 17:34 libuuid.so.1.3.0
$ ll /home/ct/anaconda3/lib/ |grep uuid
-rw-rw-r-- 2 ct ct 26398 1月 12 2018 libuuid.a
-rwxrwxr-x 1 ct ct 950 11月 28 09:09 libuuid.la*
lrwxrwxrwx 1 ct ct 16 11月 28 09:09 libuuid.so -> libuuid.so.1.0.0*
lrwxrwxrwx 1 ct ct 16 11月 28 09:09 libuuid.so.1 -> libuuid.so.1.0.0*
-rwxrwxr-x 2 ct ct 18472 1月 12 2018 libuuid.so.1.0.0*
可以看出系统库使用的实际是1.3.0版本,而anaconda使用的是1.0.0版本
问题解决
- 方法1 删掉错误的(要备份)
cd /usr/local/lib
sudo mkdir backup.libuuid
sudo mv libuuid* backup.libuuid
- 方法2 覆盖错误的(要备份)
sudo mkdir backup.libuuid
sudo mv libuuid* backup.libuuid
sudo ln -s /lib/x86_64-linux-gnu/libuuid.so.1 /home/XXX/anaconda3/lib/libuuid.so.1
- 方法3 项目中引用正确的(推荐)
添加到ROS中的CMakeLists.txt搜索路径
LINK_DIRECTORIES(/lib/x86_64-linux-gnu/)
target_link_libraries(class1_ros_qt_demo libuuid.so.1 ${QT_LIBRARIES} ${catkin_LIBRARIES})