1 问题背景

环境:

  • Ubuntu20.04
  • ROS noetic
  • Anaconda

现象:编译一个ROSRviz插件报错:

/usr/bin/ld: /lib/x86_64-linux-gnu/libapr-1.so.0: undefined reference to ‘uuid_generate@UUID_1.0’

在这里插入图片描述

2 问题探索

下载一个辅助工具locate

sudo apt install locate
sudo updatedb

locate命令用于搜索和定位文件,且相比find命令搜索速度更快,同时也支持在搜索文件时使用正则表达式。

另一个有用的内置命令是ldd,它用来打印或者查看程序运行所需的共享库(访问共享对象依赖关系),常用来解决程序因缺少某个库文件而不能运行的一些问题。而本文遇到的问题正是库的链接问题,因此需要用到ldd

接着按以下思路探索:

  1. 报错信息指出是动态链接库libapr-1.so.0未定义对uuid的引用,因此查看该库对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 (0x00007fdfdd2f1000)
    
  2. 定位系统中的库文件

    locate libuuid.so.1
    

    得到

    /home/winter/Project/anaconda3/lib/libuuid.so.1
    /snap/core/14447/lib/x86_64-linux-gnu/libuuid.so.1
    /snap/core/14784/lib/x86_64-linux-gnu/libuuid.so.1
    /snap/core18/2697/lib/x86_64-linux-gnu/libuuid.so.1
    /snap/core18/2708/lib/x86_64-linux-gnu/libuuid.so.1
    /snap/core20/1822/usr/lib/x86_64-linux-gnu/libuuid.so.1
    /snap/core20/1828/usr/lib/x86_64-linux-gnu/libuuid.so.1
    /usr/lib/x86_64-linux-gnu/libuuid.so.1
    

    关键点在于:系统中安装了Anaconda,因此系统调用库文件时其实调用了/home/winter/Project/anaconda3/lib/libuuid.so.1路径下的库

  3. 分别查看这两种库使用的版本

    系统版本

    ll /lib/x86_64-linux-gnu/ | grep uuid
    -rw-r--r--   1 root root     47314 2月   7  2022 libuuid.a
    lrwxrwxrwx   1 root root        38 2月   7  2022 libuuid.so -> /lib/x86_64-linux-gnu/libuuid.so.1.3.0
    lrwxrwxrwx   1 root root        16 2月   7  2022 libuuid.so.1 -> libuuid.so.1.3.0
    -rw-r--r--   1 root root     30936 2月   7  2022 libuuid.so.1.3.0
    

    Anaconda版本

    ll Project/anaconda3/lib | grep uuid
    -rw-rw-r--  2 winter winter     29830 10月  6  2021 libuuid.a
    lrwxrwxrwx  1 winter winter        16 4月  10  2022 libuuid.so -> libuuid.so.1.0.0*
    lrwxrwxrwx  1 winter winter        16 4月  10  2022 libuuid.so.1 -> libuuid.so.1.0.0*
    -rwxrwxr-x  2 winter winter     22480 10月  6  2021 libuuid.so.1.0.0*
    

    可以看到系统版本中libuuid.so.1实际指向1.3.0版本,而Anaconda版本中libuuid.so.1实际指向1.0.0版本,版本的差异导致引用的未定义

3 问题解决

将Anaconda版本中libuuid.so.1指向系统版本1.3.0即可

rm Project/anaconda3/lib/libuuid.so.1
sudo ln -s /lib/x86_64-linux-gnu/libuuid.so.1 Project/anaconda3/lib/libuuid.so.1

检查软链接情况

ll Project/anaconda3/lib | grep uuid
-rw-rw-r--  2 winter winter     29830 10月  6  2021 libuuid.a
lrwxrwxrwx  1 winter winter        16 4月  10  2022 libuuid.so -> libuuid.so.1.0.0*
lrwxrwxrwx  1 root   root          34 3月  21 12:25 libuuid.so.1 -> /lib/x86_64-linux-gnu/libuuid.so.1
-rwxrwxr-x  2 winter winter     22480 10月  6  2021 libuuid.so.1.0.0*

更改成功,重新编译

在这里插入图片描述

4 告别Bug

本文收录于《告别Bug》专栏,该专栏记录人工智能领域中各类Bug以备复查,文章形式为:问题背景 + 问题探索 + 问题解决,订阅专栏+关注博主后可通过下方名片联系我进入AI技术交流群帮忙解决问题


🔥 更多精彩专栏


👇源码获取 · 技术交流 · 抱团学习 · 咨询分享 请联系👇
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐