在使用maptam的calibration camera的時候發現一個問題,運:
roslaunch mcptam camera_calibrator.launch camera_name:=camera1 device:=/dev/video0
提示出錯:symbol lookup error: /usr/lib/liblapack.so.3: undefined symbol: sgetrs_N_parallel
網上的相關資料比較少,按照博主http://blog.sina.com.cn/s/blog_6594d5d30102wwx6.html 的講解,應該時多個版本的庫衝突的問題,本來想要按照指示刪除 liblapack-dev, 先刪除了 libatlas-base, 等到刪除libpack-dev的時候,提醒將會有14個軟件被卸載,不僅包括liblapack-dev, 還包括 了我的ros-kinect-desktop-full, 我之前沒看清楚就刪除了一次,這次不敢再刪,換了個思路,查蘭liblapack.so.3的鏈接文件;
cd /usr/lib
ls -lR |grep lapack
列出所有與lapack相關的軟連接,具體結果如下:
drwxr-xr-x 2 root root 4096 5月 21 13:46 lapack
lrwxrwxrwx 1 root root 29 5月 21 13:48 liblapack.a -> /etc/alternatives/liblapack.a
lrwxrwxrwx 1 root root 30 5月 21 13:48 liblapack.so -> /etc/alternatives/liblapack.so
lrwxrwxrwx 1 root root 32 5月 22 10:36 liblapack.so.3 -> /etc/alternatives/liblapack.so.3
lrwxrwxrwx 1 root root 34 5月 22 11:16 liblapack.so.3gf -> /etc/alternatives/liblapack.so.3gf
./lapack:
-rw-r--r-- 1 root root 10922022 1月 17 2016 liblapack.a
lrwxrwxrwx 1 root root 18 1月 17 2016 liblapack.so -> liblapack.so.3.6.0
lrwxrwxrwx 1 root root 18 1月 17 2016 liblapack.so.3 -> liblapack.so.3.6.0
-rw-r--r-- 1 root root 6259328 1月 17 2016 liblapack.so.3.6.0
-rw-r--r-- 1 root root 6172176 4月 19 2016 liblapack.so.3
-rw-r--r-- 1 root root 213 1月 17 2016 lapack-netlib.pc
lrwxrwxrwx 1 root root 27 5月 21 13:48 lapack.pc -> /etc/alternatives/lapack.pc
-rw-r--r-- 1 root root 14832 4月 17 2016 lapack_lite.x86_64-linux-gnu.so
這裏看到,執行roslaunch的時候調用的liblapack.so.3 庫主要指向的就是/etc/alternatives 下的liblapack.so.3
update-alternatives 時Ubuntu下專門維護系統命令連接符的工具,可以很黨鞭的設置系統默認使用那個命令,那個軟件版本,主要會用到的是
update-alternatives --install 用於增加一組新的系統命令連接符
update-alternatives --display 用於查看一個命令鏈接組的所有信息,
update-alternatives --remove 用於刪除一個alternative
update-alternatives --config 用於爲現有的命令鏈接選擇一個作爲系統默認的
由上面的軟連接查詢結果也可以看到,在 /usr/lib 下有liblapack.so.3 , 並且在 /usr/lib/lapack 下 也有liblapack.so.3 , 所以要先了解系統默認調用的究竟是那個liblapack.so.3
shinan@shinan-HP-Pavilion-Gaming-Laptop-15-cx0xxx:/etc/alternatives$ sudo update-alternatives --config liblapack.so.3
有 2 個候選項可用於替換 liblapack.so.3 (提供 /usr/lib/liblapack.so.3)。
選擇 路徑 優先級 狀態
------------------------------------------------------------
* 0 /usr/lib/openblas-base/liblapack.so.3 40 自動模式
1 /usr/lib/lapack/liblapack.so.3 10 手動模式
2 /usr/lib/openblas-base/liblapack.so.3 40 手動模式
要維持當前值[*]請按<回車鍵>,或者鍵入選擇的編號:1
查詢結果如上, 總共由兩種情況, * 哪行時默認的,openblas下的liblapack, 這裏做一個切換,換成1, 因爲默認的那個是我自己安裝的openblas,我不確定是否正確, 換成1之後,再次運行roslaunch, 提示如下:
symbol lookup error: /usr/lib/libblas.so.3: undefined symbol: sgemv_thread_n
這次換成libblas.so.3 出錯,也是用同樣的方法, 查看:
sudo update-alternatives --config libblas.so.3
有 2 個候選項可用於替換 libblas.so.3 (提供 /usr/lib/libblas.so.3)。
選擇 路徑 優先級 狀態
------------------------------------------------------------
* 0 /usr/lib/openblas-base/libblas.so.3 40 自動模式
1 /usr/lib/libblas/libblas.so.3 10 手動模式
2 /usr/lib/openblas-base/libblas.so.3 40 手動模式
要維持當前值[*]請按<回車鍵>,或者鍵入選擇的編號:1
同樣將其切換成1, 在次進行roslaunch,不會再報錯。