yocto中编译imx-test

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库。两个可能:

  1. 这两个库没有编译
  2. 编译生成了需要的库,但是在编译mxc_vpu_test的时候对应的路径给的不对

第一条,在编译生成的文件中寻找libvpu.solibipu.so,发现其实都有生成,那么情况就是第二条了

继续查看log,发现所给的编译文件中打印的编译日志命令确实不包含yocto中生成库的路径,默认的是/usr/lib/lib 等。
问题找到了,接下来就是解决问题了

解决

关于解决该问题其实尝试过很多方式,其中一个就是更改源码,将路径直接指定完全(通过添加-L -l等参数的手段),能解决上面出现的问题,但是会出现其他包找不到的问题。
还有一些其他的尝试就不说了,把最终更改好的思路放在这里

  1. 通过查看imx-test的源码中的Makefile文件,会看到这样一行代码export INC CROSS_COMPILE LINUXPATH PLATFORM TOPDIR OBJDIR,也就是在真正编译的时候会使用到这些环境变量,而这些环境变量是可以在make阶段制定的,那么思路就是添加一个变量,通过这种方式传入进来
  2. 在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
  1. 在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}"你知道是干嘛的,实际内容是多少么?(大笑)
好了,言尽于此,有兴趣的童鞋自然会跟着去研究,没有兴趣的直接拿解决问题的成果就好了(并不一定一定跟我一样的问题,但是这东西不都是触类旁通的么)。哈哈……

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值