Xilinx SDSoc 加载opencv库

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目录

启动SDx 按照上一篇文章里面的步骤创建一个项目zcu102client,选中创建的项目,鼠标点击菜单栏的Xilinx 选中SDx Liraries

展开Xilinx xfopencv Library , 双击然后选择下面的Add to Project 会让你选择添加到哪个Project,点击ok完成添加。

添加完成后在选中创建的项目,点击Properties,可以看到Libraries下面多出来的就是上一步中SDx IDE自动为我们添加的opencv库。

这里可以把你用不到的库都删除掉,比如我就只用到了opencv_core 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