最近需要用到HLS的FFT库,写了一个简单代码后编译报错:
../Vitis_HLS/hls_fft.h:670: undefined reference to 'xilinx_ip_xfft_v9_1_create_state'
../Vitis_HLS/hls_fft.h:771: undefined reference to 'xilinx_ip_xfft_v9_1_bitacc_simulate'
../Vitis_HLS/hls_fft.h:820: undefined reference to 'xilinx_ip_xfft_v9_1_destroy_state'
从hls_fft.h逐步定位到xfft_v9_1_bitacc_cmodel.h中发现这几个函数都只有声明,而找不到定义。
先去百度和Goole都搜了一下,没有相关的问题解决方法。但是受到网上仅有的一篇相关文章的启发,我在linux系统里面搜索了一下libIp_xfft_v9_1_bitacc_cmodel.so
,还真让我搜到了,在这个路径下:
/tools/Xilinx/Vitis_HLS/2021.1/lnx64/tools/fft_v9_1
前面的/tools/
是你安装Xilinx的文件夹,然后按照上述路径就可以找到libIp_xfft_v9_1_bitacc_cmodel.so
。
大喜,以为这个问题马上能解决了。然后在Makefile中添加这个路径,并加入到CFLAG中,如果你的makefile中有下面类似的代码,那你也加入到里面:
LIBVITIS_LIB := /tools/Xilinx/Vitis_HLS/2021.1/lnx64/tools/fft_v9_1
CFLAGS += -L$(LIBVITIS_LIB) -lIp_xfft_v9_1_bitacc_cmodel
run: $(OBJ)
$(ECHO_OFF) $(CC) $(CFLAGS) -I$(INCDIR) $^ -o $@ -lIp_xfft_v9_1_bitacc_cmodel
通过make进行编译,报错:
/usr/bin/ld: warning: libgmp.so.11, needed by /tools/Xilinx/Vitis_HLS/2021.1/lnx64/tools/fft_v9_1/libIp_xfft_v9_1_bitacc_cmodel.so, not found (try using -rpath or -rpath-link)
/tools/Xilinx/Vitis_HLS/2021.1/lnx64/tools/fft_v9_1/libIp_xfft_v9_1_bitacc_cmodel.so: undefined reference to `__gmpz_add'
/tools/Xilinx/Vitis_HLS/2021.1/lnx64/tools/fft_v9_1/libIp_xfft_v9_1_bitacc_cmodel.so: undefined reference to `__gmpz_set_ui'
/tools/Xilinx/Vitis_HLS/2021.1/lnx64/tools/fft_v9_1/libIp_xfft_v9_1_bitacc_cmodel.so: undefined reference to `__gmpz_set'
/tools/Xilinx/Vitis_HLS/2021.1/lnx64/tools/fft_v9_1/libIp_xfft_v9_1_bitacc_cmodel.so: undefined reference to `__gmpz_fdiv_q_2exp'
/tools/Xilinx/Vitis_HLS/2021.1/lnx64/tools/fft_v9_1/libIp_xfft_v9_1_bitacc_cmodel.so: undefined reference to `__gmpz_set_d'
/tools/Xilinx/Vitis_HLS/2021.1/lnx64/tools/fft_v9_1/libIp_xfft_v9_1_bitacc_cmodel.so: undefined reference to `__gmpz_addmul'
/tools/Xilinx/Vitis_HLS/2021.1/lnx64/tools/fft_v9_1/libIp_xfft_v9_1_bitacc_cmodel.so: undefined reference to `__gmpz_sub'
/tools/Xilinx/Vitis_HLS/2021.1/lnx64/tools/fft_v9_1/libIp_xfft_v9_1_bitacc_cmodel.so: undefined reference to `__gmpz_init'
/tools/Xilinx/Vitis_HLS/2021.1/lnx64/tools/fft_v9_1/libIp_xfft_v9_1_bitacc_cmodel.so: undefined reference to `__gmpz_clear'
/tools/Xilinx/Vitis_HLS/2021.1/lnx64/tools/fft_v9_1/libIp_xfft_v9_1_bitacc_cmodel.so: undefined reference to `__gmpz_get_d'
/tools/Xilinx/Vitis_HLS/2021.1/lnx64/tools/fft_v9_1/libIp_xfft_v9_1_bitacc_cmodel.so: undefined reference to `__gmpz_inits'
/tools/Xilinx/Vitis_HLS/2021.1/lnx64/tools/fft_v9_1/libIp_xfft_v9_1_bitacc_cmodel.so: undefined reference to `__gmpz_mul_2exp'
/tools/Xilinx/Vitis_HLS/2021.1/lnx64/tools/fft_v9_1/libIp_xfft_v9_1_bitacc_cmodel.so: undefined reference to `__gmpz_submul'
/tools/Xilinx/Vitis_HLS/2021.1/lnx64/tools/fft_v9_1/libIp_xfft_v9_1_bitacc_cmodel.so: undefined reference to `__gmpz_clears'
/tools/Xilinx/Vitis_HLS/2021.1/lnx64/tools/fft_v9_1/libIp_xfft_v9_1_bitacc_cmodel.so: undefined reference to `__gmpz_tstbit'
/tools/Xilinx/Vitis_HLS/2021.1/lnx64/tools/fft_v9_1/libIp_xfft_v9_1_bitacc_cmodel.so: undefined reference to `__gmpz_swap'
/tools/Xilinx/Vitis_HLS/2021.1/lnx64/tools/fft_v9_1/libIp_xfft_v9_1_bitacc_cmodel.so: undefined reference to `__gmpz_mul'
OK, fine, 看着还好,只是缺少libgmp.so.11
,我们采用老方法,先搜索一下改文件在哪:find / -name libgmp.so.11
, 发现在:/tools/Xilinx/Vitis_HLS/2021.1/lnx64/tools/fpo_v7_0/libgmp.so.11
中,我们将其软链接到libIp_xfft_v9_1_bitacc_cmodel.so
所在的文件夹中:
ln -s /tools/Xilinx/Vitis_HLS/2021.1/lnx64/tools/fpo_v7_0/libgmp.so.11 /tools/Xilinx/Vitis_HLS/2021.1/lnx64/tools/fft_v9_1/libgmp.so
脚下留心:如果你软链接之后不想要这个软链接了,千万不要用rm -rf libgmp.so
来删除,这样的话会把源文件也一起删除,而应该用:unlink libgmp.so
。
注意这里需要链接到libgmp.so
,而不是libgmp.so.11
。软链接完成后,需要按早上述方式将libgmp.so
也加入到makefile中。
LIBVITIS_LIB := /tools/Xilinx/Vitis_HLS/2021.1/lnx64/tools/fft_v9_1
CFLAGS += -L$(LIBVITIS_LIB) -lIp_xfft_v9_1_bitacc_cmodel -lgmp
run: $(OBJ)
$(ECHO_OFF) $(CC) $(CFLAGS) -I$(INCDIR) $^ -o $@ -lIp_xfft_v9_1_bitacc_cmodel -lgmp
加入完成后,先make clean,然后重新编译,叒报错:
error while loading shared libraries: libgmp.so.11: cannot open shared object file: No such file or directory
Nice,百度,已解决:动态库加载失败:cannot open shared object file: No such file or directory,这篇文章讲了好几种方法,我依次试了一下,发现单纯进行export LD_LIBRARY_PATH没有作用,只有最后一种方法管用:
sudo vim /etc/ld.so.conf
输入o(小写的o)进入输入模式,输入动态库的绝对路径/tools/Xilinx/Vitis_HLS/2021.1/lnx64/tools/fft_v9_1和/tools/Xilinx/Vitis_HLS/2021.1/lnx64/tools/fpo_v7_0。注意一定要将libgmp.so.11
和libIp_xfft_v9_1_bitacc_cmodel.so
的源文件路径都加入进来才管用!。输入完成后,按下esc键,然后输入:wq,保存并退出。
然后输入如下命令,进行更新
sudo ldconfig
重新make clean,再编译,发现问题解决了。