yocto传统知识点以及动态库编译错误解决

项目场景:

最近调试一些小case,用于在根文件系统中安装部分动态库,项目的构建是基于yocto,因为老是忘记,所以记录一些常规的知识点和问题点


1、YOCTO变量名含义

**THISDIR**:bb或bbappend文件所在目录

**PACKAGE_ARCH**:包架构名 	查看自己构建的包 bitbake -e core-image-base | grep ^PACKAGE_ARCH 

**TARGET_OS**:指定目标的操作系统。对于基于 glibc 的系统(GNU C 库),该变量可以设置为“linux”,对于 ARM/EABI 目标,存在“linux-gnueabi”和“linux-musleabi”可能的值。  查看 bitbake -e core-image-base | grep ^TARGET_OS

**PN**:用于构建包的配方名称或包的名称,如果配方名为 libpcm_2.1.bb,则PN默认值为“libpcm”

**BP**:BP 由组成为${BPN}-${PV} 	bitbake -e core-image-base | grep ^BP 

**WORKDIR**:该目录位于TMPDIR目录下,实际路径基于正在构建的配方和正在构建的系统,默认定义如下:

**$(TMPDIR)/work/${MULTIMACH_TARGET_SYS}/${PN}/${EXTENDPE}${PV}-${PR}**

TMPDIR: 顶层构建输出目录
MULTIMACH_TARGET_SYS: 目标系统标识符,默认值为${PACKAGE_ARCH}${TARGET_VENDOR}-${TARGET_OS} 
EXTENDPE: 扩展前缀 ,如果PE未指定,EXTENDPE`则为空白

**S**:解压后的配方源代码所在路径,该变量位于配方文件中(如有需要可在此文件中修改)。默认情况下,此目录为${WORKDIR}/${BPN}-${PV},
如果源代码是从 SCM(例如 Git 或 Subversion)获取的,则必须在配方中设置, 假设bb文件中指定源码来源于git,则在 do_fetch 期间,源码将被被克隆到 ${WORKDIR}/git  

**B**:包构建的编译目录,一般情况${B}与${S}相同,即为${WORKDIR}/${BPN}-${PV}**D**: 包构建成果物的安装目录,也称为目标目录。默认情况这个目录为${WORKDIR}/image。

2、层构建

当你想要创建一个新的层在你自己的工程中,有两种方法:
1、复制已有的层。修改一些你自己定义的参数就行。
2、使用yocto自带的tools。首先你要source你工程中的环境变量,例如默认的yocto环境初始化是source oe-init-build-env #注意,执行完这个命令后将自动进入build目录(以下指令在build目录下执行)
bitbake-layers create-layer …/meta-test #用于创建一个新层在工程目录下
bitbake-layers add-layer …/meta-test #在conf/bblayers.conf中追加对该层的包含

通过以上两种方法完成对自己的层构建以后,就可以在其中加入你想要的bb文件。

3、配方文件

在一个yocto工程中会多个层级,一般我们使用一个自己的层级,在层级中加入不同的菜谱(recipes-),在菜谱中加入不同的菜式(.bb),带有.bb后缀的文件称之为配方文件。例如我书写一个安装动态库到根文件系统中的配方文件funcadd.bb:

SUMMARY = "Simple func demo"  	#描述该配方的用处
SECTION = "examples"		
LICENSE = "MIT"					#签证
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"

SRC_URI = " \ 			#本地的文件
    file://func.c \
	file://func.h \
    file://Makefile \
    "
S = "${WORKDIR}"	#重定向源码路径
INSANE_SKIP_${PN}-dev += "dev-elf ldflags"

#我的Makefile是编译成一个libfunc.so的动态库
do_install() {
	install -d ${D}/usr/lib
	install -m 0755 ${S}/libfunc.so ${D}/usr/lib  #将该生成的库加入到${D}/usr/lib中

}

一个非常简单的demo库就完成了,不过在最后决定该库是否参与到打包中还需要另外一个变量决定:

IMAGE_INSTALL_append_pn-core-image-base = “funcadd” #在你的全局配置文件(*.conf)中加入,core-image-base是代表当前我项目中使用的打包参数,该参数可以根据实际使用情况自定义。或者可以直接使用IMAGE_INSTALL += “XXX”,这对所有的项目都生效(一个工程中有一个以上项目的话就会影响到其他)。

4、动态库在配方文件(*.bb)中编译的错误总结

1、#QA Issue: No GNU_HASH in the elf binary
INSANE_SKIP_${PN} = “ldflags”

2、#QA Issue: -dev package contains non-symlink .so
FILES_SOLIBSDEV = “”

3、No match XXX
有两种情况:
其一:IMAGE_INSTALL该配方的名字错了或者有其他名字
其二:在编译动态库中加入了FILES_${PN} += “/usr/lib/ *.so” , 这句话可以去掉

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值