yocto中编译imx-test
背景
前段时间使用vpu,在利用官方给的测试程序,配置好yocto环境后,大部分的测试程序可以顺利编译出来,会有mxc_xxx_test.out的二进制文件出现,但是想要的mxc_vpu取并没有编译出来,经过多番追踪与修改后,顺利编译出来,现将整个过程记录下来。
查找
在yocto的生成文件路径找到log日志文件build/xxxxx/tmp/work/xxxxx/imx-test/1_3.10.17-1.0.0-r0/temp/log.do_compile
中查找到vpu相关的关键词,发现有Error出现
cannot find -lvpu
cannot find -lipu
没有找到对应的vpu和ipu库。两个可能:
- 这两个库没有编译
- 编译生成了需要的库,但是在编译mxc_vpu_test的时候对应的路径给的不对
第一条,在编译生成的文件中寻找libvpu.so
和 libipu.so
,发现其实都有生成,那么情况就是第二条了
继续查看log,发现所给的编译文件中打印的编译日志命令确实不包含yocto中生成库的路径,默认的是/usr/lib
和 /lib
等。
问题找到了,接下来就是解决问题了
解决
关于解决该问题其实尝试过很多方式,其中一个就是更改源码,将路径直接指定完全(通过添加-L -l
等参数的手段),能解决上面出现的问题,但是会出现其他包找不到的问题。
还有一些其他的尝试就不说了,把最终更改好的思路放在这里
- 通过查看imx-test的源码中的Makefile文件,会看到这样一行代码
export INC CROSS_COMPILE LINUXPATH PLATFORM TOPDIR OBJDIR
,也就是在真正编译的时候会使用到这些环境变量,而这些环境变量是可以在make阶段制定的,那么思路就是添加一个变量,通过这种方式传入进来。 - 在imx-test的源码根
Makefile
文件中更改如下export INC CROSS_COMPILE LINUXPATH PLATFORM TOPDIR OBJDIR LDIR
,即增加了一个变量LDIR
。在test/mxc_vpu_test/Makefile
文件中更改如下:
CC ?=$(CROSS_COMPILE)gcc
LINK ?=$(CC) # 修改点
OBJ = main.o \
dec.o \
enc.o \
capture.o \
display.o \
fb.o \
utils.o \
loopback.o \
transcode.o
# list of platforms which want this test case
INCLUDE_LIST:=IMX27ADS IMX51 IMX53 IMX6Q
ifeq ($(PLATFORM),$(findstring $(PLATFORM),$(INCLUDE_LIST)))
TARGET = mxc_vpu_test.out
else
TARGET =
endif
all: $(TARGET)
$(TARGET): $(OBJ)
$(LINK) $(LDIR) -o $(TARGET) $(OBJ) ${LIBS} -lvpu -lipu -lrt -lpthread # 修改点,主要就是LDIR
mkdir -p $(OBJDIR)
mv $(TARGET) $(OBJDIR)
cp autorun-vpu.sh $(OBJDIR)
cp ./configs/config* $(OBJDIR)
cp ./configs/akiyo.mp4 $(OBJDIR)
%.o: %.c
$(CC) $(INC) -Wall -O2 -c $^ -o $@
.PHONY: clean
clean:
rm -f $(OBJDIR)/$(TARGET) $(OBJ)
include ../make.rules
- 在yocto文件中修改文件
sources/meta-fsl-arm/recipes-bsp/imx-test/imx-test.inc
do_compile() {
LDFLAGS="" make PLATFORM=${PLATFORM} LINUXPATH=${STAGING_KERNEL_DIR} \
KBUILD_OUTPUT=${STAGING_KERNEL_DIR} CROSS_COMPILE=${TARGET_PREFIX} V=1 \
- INC="${INCLUDE_DIR}"
+ INC="${INCLUDE_DIR}" LDIR="${BUILD_LDFLAGS}" # 关注LDIR
}
至此,问题解决,可以顺利编译出想要的二进制文件
总结
该文过程写的比较简单,但是在整个过程中也算比较艰辛了,各种绞尽脑汁的想办法。或许这些东西真的能看出程序员是比较爱动脑经的一帮人吧,哈哈哈哈……
总结一些用到的东西就是gcc编译相关的知识要知道,yocto中相关理论要知道,还有对yocto的特性要熟了,不然问个问题:更改后的源码你是怎么放到yocto中编译的呢?(笑脸)
再问个,不知道yocto,文件sources/meta-fsl-arm/recipes-bsp/imx-test/imx-test.inc
中加的"${BUILD_LDFLAGS}"
你知道是干嘛的,实际内容是多少么?(大笑)
好了,言尽于此,有兴趣的童鞋自然会跟着去研究,没有兴趣的直接拿解决问题的成果就好了(并不一定一定跟我一样的问题,但是这东西不都是触类旁通的么)。哈哈……