【SDR-UHD】明明安装了UHD库,调用find函数时找不到设备解决办法

最近碰到一个奇怪的问题,困惑好了,最终终于找到了问题的根源,故分享出来,希望对碰到类似问题的朋友有所帮助。
%%%%%%%%%%%%%%%%分割线%%%%%%%%%%%%
安装了最新的uhd库(下载源码编译安装),在编译uhd库时,会在\master\host\utils目下下面生成一个uhd_find_device的可执行文件,运行该程序可以查找连接的usrp设备。
我运行该程序可以找到USRP设备(e320x系列设备),然后我为了检测安装的uhd库是否正确,把uhd_find_device.cpp文件单独拿出来编译
g++ uhd_find_device.cpp -o find -std=c++11 -luhd -lboost_program_options
奇怪的是,以同样的方式运行find程序,居然找不到设备!后来才发现原因是电脑上面安装了uhd库不同的版本,结果连接到了一个较低的版本,结果较低版本不支持e320系列设备,因此最终没有找到设备。
具体过程如下:
(1)运行uhd_find_device可以找到设备
【SDR-UHD】明明安装了UHD库,调用find函数时找不到设备解决办法_第1张图片
运行自己编译的,找不到设备
在这里插入图片描述
(2)对比发现两个程序运行时调用的uhd驱动的版本不一样
通过程序运行时第一行打印可以看到,可以成功找到设备的程序uhd_find_device调用的库为UHD_3.15.0.0-0,第二次运行自己单独编译的程序时,uhd库版本为是UHD_003.009。
于是通过命令查询安装的uhd库:
ldconfig -p |grep uhd
【SDR-UHD】明明安装了UHD库,调用find函数时找不到设备解决办法_第2张图片发现果然安装了连个不通版本的uhd库,路径分别为:
/usr/local/lib/libuhd.so.3.15.0
/usr/lib/x86_64-linux-gnu/libuhd.so.003

由此可以推知,我在使用命令:
g++ uhd_find_device.cpp -std=c++11 -luhd -lboost_program_options
编译时,连接uhd库时连接到了libuhd.so.003版本(估计是003版本太低了,不支持e320系列设备)

(3)解决方法
方法一:编译时指定连接的uhd库的路径,这样就会去找指定的uhd库了
通过-L指定uhd库的路径
g++ find.cpp -std=c++11 -L/usr/local/lib/ -luhd -lboost_program_options
方法二:
移除003版本库
直接cd到/usr/lib/x86_64-linux-gnu/下
使用rm命令删除相关库就好
sudo rm libuhd.so.003
sudo rm libuhd.so.003.009
然后编译时不用指定路径,也会知道到3.15版本库
g++ uhd_find_device.cpp -std=c++11 -luhd -lboost_program_options

顺便提一下,之前另外一个项目用到uhd库中uhd/usrp/multi_usrp.hpp文件
连接到uhd库时编译出错,提示为定义符号,估计也是这个原因。
g++ usrp.cpp -o usrp -luhd /tmp/ccbTdqU8.o:在函数‘main’中: usrp.cpp:(.text+0x122):对‘uhd::usrp::multi_usrp::ALL_MBOARDS’未定义的引用 usrp.cpp:(.text+0x15e):对‘uhd::usrp::multi_usrp::ALL_MBOARDS’未定义的引用 usrp.cpp:(.text+0x1d3):对‘uhd::usrp::multi_usrp::ALL_CHANS’未定义的引用 collect2: error: ld returned 1 exit status

你可能感兴趣的:(【SDR-UHD】明明安装了UHD库,调用find函数时找不到设备解决办法)