1. 问题描述
- 在vitis2023.1使用自定义ip生成的工程会出现如下报错:
2. 解决办法
- 查看编译过程,定位报错位置
这个错误在整个编译过程中一共出现了三次,事实上这段程序在整个编译过程中一共编译了三次。
- 搜索"Compiling axi_lite_slave…", 如下就是报错Makefile的位置,均是vitis为我自定义ip生成的Makefile.
- 自动生成的Makefile如下,熟悉Makefile应该能看出了这个Makefile是个半成品,官方意图很明显,是希望使用者自己编写自定义ip的驱动和Makefile,使用者应该具备为自定义ip编写驱动和Makefile的能力,所以vitis没有再像sdk一样为用户编写能够编译通过的Makefile .
COMPILER= ARCHIVER= CP=cp COMPILER_FLAGS= EXTRA_COMPILER_FLAGS= LIB=libxil.a RELEASEDIR=../../../lib INCLUDEDIR=../../../include INCLUDES=-I./. -I${INCLUDEDIR} INCLUDEFILES=*.h LIBSOURCES=*.c OUTS = *.o libs: echo "Compiling axi_lite_slave..." $(COMPILER) $(COMPILER_FLAGS) $(EXTRA_COMPILER_FLAGS) $(INCLUDES) $(LIBSOURCES) $(ARCHIVER) -r ${RELEASEDIR}/${LIB} ${OUTS} make clean include: ${CP} $(INCLUDEFILES) $(INCLUDEDIR) clean: rm -rf ${OUTS}
- 解决办法 - 用户可以参考官方为他们其他模块编译的Makefile,事实上那些makefile都是通用的,直接复制过来将vitis为自定义ip生成的那三个半成品Makefile替换掉就行了。
通用的Makefile如下DRIVER_LIB_VERSION = 1.0 COMPILER= ARCHIVER= CP=cp COMPILER_FLAGS= EXTRA_COMPILER_FLAGS= LIB=libxil.a CC_FLAGS = $(COMPILER_FLAGS) ECC_FLAGS = $(EXTRA_COMPILER_FLAGS) RELEASEDIR=../../../lib/ INCLUDEDIR=../../../include/ INCLUDES=-I./. -I$(INCLUDEDIR) SRCFILES:=$(wildcard *.c) OBJECTS = $(addprefix $(RELEASEDIR), $(addsuffix .o, $(basename $(wildcard *.c)))) libs: $(OBJECTS) DEPFILES := $(SRCFILES:%.c=$(RELEASEDIR)%.d) include $(wildcard $(DEPFILES)) include $(wildcard ../../../../dep.mk) $(RELEASEDIR)%.o: %.c ${COMPILER} $(CC_FLAGS) $(ECC_FLAGS) $(INCLUDES) $(DEPENDENCY_FLAGS) $< -o $@ .PHONY: include include: $(addprefix $(INCLUDEDIR),$(wildcard *.h)) $(INCLUDEDIR)%.h: %.h $(CP) $< $@ clean: rm -rf ${OBJECTS} rm -rf $(DEPFILES)
3. 总结
这个问题并不是一个bug,而是官方希望使用者自行为自定义IP编写驱动和Makefile。灵活性增加了,但同时也对使用者提出了更高的要求。