硬件:雷神MIX G139H047LD 工控机
系统:ubuntu20.04
之前运行某项目时,处于正常状态。后来由于要使用海康威视工业相机(型号:MV-CA013-21UC),便下载了并安装了该相机的SDK,之后运行原本正常的项目,就会出现以下错误:
/usr/bin/ld: …/…/lib/libpcl_io.so.1.8.0: undefined reference to `libusb_set_option’
由于该错误中出现了 libpcl,错误以为是前期安装编译pcl存在问题,故开始进行pcl1.8.1版本的安装和编译,这个过程中出现了很多error,再全部解决之后,终于pcl编译成功了,
原本以为这次可以顺利通过项目编译,但是再次出现了“/usr/bin/ld: …/…/lib/libpcl_io.so.1.8.0: undefined reference to `libusb_set_option’”的error,思考之后,觉得可能是海康威视相机SDK导致的该错误。正好看到以下文章,也是解决这个错误,便借鉴了以下文章。
https://blog.csdn.net/qq_40301351/article/details/144818802?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522feb47a6e9229e901500bcd662d336f6f%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=feb47a6e9229e901500bcd662d336f6f&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-144818802-null-null.142^v101^pc_search_result_base7&utm_term=undefined%20reference%20to%20%60libusb_set_option&spm=1018.2226.3001.4187https://blog.csdn.net/qq_40301351/article/details/144818802?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522feb47a6e9229e901500bcd662d336f6f%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=feb47a6e9229e901500bcd662d336f6f&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-144818802-null-null.142^v101^pc_search_result_base7&utm_term=undefined%20reference%20to%20%60libusb_set_option&spm=1018.2226.3001.4187
出现上述error的原因在于:
安装海康相机SDK后,系统原本的 libusb
依赖会被重新链接到海康SDK指定的路径。由于 libusb
是许多外设程序的重要依赖库,这种更改可能导致其他设备驱动或程序(例如使用系统默认 libusb
的程序)出现冲突,从而引发上述错误。
解决方法:
1、查看环境变量配置
echo $LD_LIBRARY_PATH
在终端运行上述命令后,输出:
jiangqiang@jiangqiang:~$ echo $LD_LIBRARY_PATH
/home/jiangqiang/jiangqiang/wk/livox_ros_driver_ws/devel/lib:/opt/ros/noetic/lib:/opt/MVS/lib/64:/opt/MVS/lib/32:/usr/lib/x86_64-linux-gnu:/opt/MVS/lib/64:/opt/MVS/lib/32:/opt/MVS/lib/64:/opt/MVS/lib/32:/usr/local/cuda-12.3/lib64
出现了包含“MVS”字母的环境变量,这些代表的是海康威视(Hikvision)MVS(Machine Vision Software)的库路径,而且LD_LIBRARY_PATH
的顺序决定了动态库的查找优先级。位于前面的MVS路径会优先被查找,因此项目原本使用的默认动态库的链接路径/usr/lib/x86_64-linux-gnu无法找到。因此报错。
2、打开bashrc
sudo gedit ~/.bashrc
通过搜索将出现“MVS”的所在语句全部注释掉,同时,在文件末尾添加以下一行:
export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH
/usr/lib/x86_64-linux-gnu
是系统默认的 libusb
路径。如果有多个默认路径,请确保所有可能的系统库路径都在 LD_LIBRARY_PATH
变量中优先级靠前。
3、保存bashrc文件
source ~/.bashrc
4、重新在工作空间中编译,编译能够顺利通过。
注意:以上这种方式存在不足,具体在于:如果这个项目同时需要用到海康威视相机时,通过上述方法会导致相机不可用,这种情况下,还可以在CMakeLists.txt中设置项目的链接路径。
即:在 CMakeLists.txt
中设置链接 libusb
的路径为 /usr/lib/x86_64-linux-gnu
使用 find_package
查找 libusb
:
CMake 提供了 find_package
来查找系统安装的库。对于 libusb
,可以使用以下代码:
find_package(libusb REQUIRED)
然后将bashrc里面的有关“MVS”的语句的注释全部取消。
运行项目代码,可以正常运行。