硬件:雷神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”的語句的注釋全部取消。
運行項目代碼,可以正常運行。