1. 程式人生 > >Xilinx SDDoc 加載opencv庫

Xilinx SDDoc 加載opencv庫

HA var find命令 line _for codec pthread share oot

Xilinx SDSoc 加載opencv庫需要下載兩個文件 xfopencv 和 Revision Platform

1.xfopencv :  github地址 https://github.com/Xilinx/xfopencv

2.revision platform :  https://www.xilinx.com/member/forms/download/design-license-xef.html?akdm=1&filename=zcu102-rv-ss-2017-4.zip

A. xfopencv下載好了以後放在 ~/.Xilinx/SDx/2017.4 目錄(2017.4請修改為你的實際版本號)

B. Revision Platform下載後解壓到/opt目錄

技術分享圖片

技術分享圖片

2. 啟動SDx 按照上一篇文章裏面的步驟創建一個項目zcu102client,選中創建的項目,鼠標點擊菜單欄的Xilinx 選中SDx Liraries

技術分享圖片

展開Xilinx xfopencv Library , 雙擊然後選擇下面的Add to Project 會讓你選擇添加到哪個Project,點擊ok完成添加。

技術分享圖片

添加完成後在選中創建的項目,點擊Properties,可以看到Libraries下面多出來的就是上一步中SDx IDE自動為我們添加的opencv庫。

技術分享圖片

這裏可以把你用不到的庫文件都刪除掉,比如我就只用到了opencv_code opencv_videoio opencv_imgcodecs

技術分享圖片

這裏還需要設置一個變量SYSROOT,設置為Revision Platform解壓後的路徑下的sw/sysroot (需要勾選show system variables才可以看到這個變量), 如下圖:

技術分享圖片

技術分享圖片

修改完成後點擊菜單欄的build就可以編譯代碼了。

下面總結一下build過程中遇到的幾個問題,希望能給大家一個參考:

/opt/Xilinx/SDK/2017.4/gnu/aarch64/lin/aarch64-linux/bin/../lib/gcc/aarch64-linux-gnu/6.2.1/../../../../aarch64-linux-gnu/bin/ld: cannot find crt1.o
/opt/Xilinx/SDK/2017.4/gnu/aarch64/lin/aarch64-linux/bin/../lib/gcc/aarch64-linux-gnu/6.2.1/../../../../aarch64-linux-gnu/bin/ld: cannot find crti.o
/opt/Xilinx/SDK/2017.4/gnu/aarch64/lin/aarch64-linux/bin/../lib/gcc/aarch64-linux-gnu/6.2.1/../../../../aarch64-linux-gnu/bin/ld: cannot find crtn.o: No such file or directory
collect2: error: ld returned 1 exit status

分析:關註到這裏報錯的ld程序所在的bin路徑,進入同級目錄的lib目錄,發現確實沒有該文件,通過find /opt/zcu102_rv_ss/ -name “crt1.o” 又發現有這個文件存在,所以我們建立一個軟連接即可

cd /opt/Xilinx/SDK/2017.4/gnu/aarch64/lin/aarch64-linux/bin/../lib/gcc/aarch64-linux-gnu/6.2.1/../../../../aarch64-linux-gnu/bin

cd ../lib

sudo ln -s /opt/zcu102_rv_ss/sw/sysroot/usr/lib/crt1.o ./crt1.o
sudo ln -s /opt/zcu102_rv_ss/sw/sysroot/usr/lib/crti.o ./crti.o
sudo ln -s /opt/zcu102_rv_ss/sw/sysroot/usr/lib/crtn.o ./crtn.o

/opt/Xilinx/SDK/2017.4/gnu/aarch64/lin/aarch64-linux/bin/../lib/gcc/aarch64-linux-gnu/6.2.1/../../../../aarch64-linux-gnu/bin/ld: cannot find /lib/libpthread.so.0
/opt/Xilinx/SDK/2017.4/gnu/aarch64/lin/aarch64-linux/bin/../lib/gcc/aarch64-linux-gnu/6.2.1/../../../../aarch64-linux-gnu/bin/ld: cannot find /usr/lib/libpthread_nonshared.a
collect2: error: ld returned 1 exit status

分析:這個錯誤和上一個不同的是錯誤信息裏面點名道姓的指定了絕對路徑下文件找不到,但是用find命令查找的時候發現/opt/zcu102_rv_ss/sw/sysroot下面有/opt/zcu102_rv_ss/sw/sysroot/usr/lib/libpthread.so這個文件,由於xilinx SDx 都是調用靜態鏈接庫?動態鏈接庫一般會指向靜態鏈接庫,所以用vim打開:

sudo vim /opt/zcu102_rv_ss/sw/sysroot/usr/lib/libpthread.so

/* GNU ld script
   Use the shared library, but some functions are only in
   the static library, so try that secondarily.  */
OUTPUT_FORMAT(elf64-littleaarch64)
GROUP ( /lib/libpthread.so.0 /usr/lib/libpthread_nonshared.a )

這裏就看出了端倪,果然是被指定了絕對路徑,把絕對路徑去掉,像這樣:
GROUP ( libpthread.so.0 libpthread_nonshared.a )

/opt/Xilinx/SDK/2017.4/gnu/aarch64/lin/aarch64-linux/bin/../lib/gcc/aarch64-linux-gnu/6.2.1/../../../../aarch64-linux-gnu/bin/ld: cannot find libpthread.so.0
collect2: error: ld returned 1 exit status

分析:還記得crt1.o crti.o crtn.o 嗎, 完全一樣的錯誤信息,我這裏為了防止類似的錯誤繼續發生,而且可以看到

/opt/Xilinx/SDK/2017.4/gnu/aarch64/lin/aarch64-linux/bin/../lib/gcc/aarch64-linux-gnu/6.2.1/../../../../aarch64-linux-gnu/lib    本身是一個空目錄,所以索性直接做了兩個目錄的軟連接
cd /opt/Xilinx/SDK/2017.4/gnu/aarch64/lin/aarch64-linux/bin/../lib/gcc/aarch64-linux-gnu/6.2.1/../../../../aarch64-linux-gnu/bin

cd ../lib

sudo ln -sf /opt/zcu102_rv_ss/sw/sysroot/lib/ .
sudo ln -sf /opt/zcu102_rv_ss/sw/sysroot/usr/ .

/opt/zcu102_rv_ss/sw/sysroot/usr/include/opencv2/core/cvdef.h error: unknown type name ‘float32x2_t‘
/opt/zcu102_rv_ss/sw/sysroot/usr/include/opencv2/core/cvdef.h error: unknown type name ‘uint32_t‘
....... (略過一大堆類似的未知類型)

分析:打開報錯的頭文件/opt/zcu102_rv_ss/sw/sysroot/usr/include/opencv2/core/cvdef.h 發現未知的類型是條件定義在一個CV_NEON宏下面的,也就是說CV_NEON = 1的時候就會報錯,所以我把CV_NEON宏全部定義為了0

技術分享圖片

 

Xilinx SDDoc 加載opencv庫