Xilinx SDSoc 加載opencv庫需要下載兩個文件 xfopencv 和 Revision Platform, Revision Platform需要和具體的開發板型號對應,我用的是zcu102開發板。
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

  
        
