yocto 应用程序调用封装so库
在yocto上写了一个gpio控制的程序封装成so库,生成.c,.h 并通过makefile管理
LIBS:= -L/${D}${libdir} -lgpioctrl -ldl
SOURCES = gpio_ctrl_test.c
OBJS = $(patsubst %.c, %.o, $(SOURCES))
TARGET = gpio_ctrl_test
all:
$(CC) ${CFLAGS} $(LIBS) $(SOURCES) -o $(TARGET)
clean:
rm -f $(OBJS) $(TARGET)
~
注意这个LIBS 不要直接定义成 -L/usr/lib 这样编译的时候会去pc主机 pc端的/usr/lib/搜索so库,而这个${D}${libdir}是开发板定义的板端环境变量,就会去板端的/usr/lib/寻找,如果这个so放置到/usr/lib/ 或是/lib/目录 ,-L 路径可以省略,因为/lib与、/usr/lib/是linux系统标准路径库,系统默认去这里搜索so文件,如果是其他路径就需要 -L后面接具体的路径了
否则会报错误
The compile log indicates that host include and/or library paths were used.
而so共享库的封装也是通过makefile管理
SOURCES = $(wildcard *.c)
OBJS = $(patsubst %.c, %.o, $(SOURCES))
CFLAGS := -Wall -O3
LIB = libgpioctrl.so
all: $(LIB)
$(OBJS): $(SOURCES)
$(CC) $(CFLAGS) -fpic -c $< -o [email protected]
$(LIB): $(OBJS)
rm -f [email protected]
$(CC) $(CFLAGS) -shared -o [email protected] $(OBJS)
rm -f $(OBJS)
clean:
rm -f $(OBJS) $(TARGET) $(LIB)
注意参数 -fpic 与 shared,这个是生成共享库的标配
然后就是yocto的bb文件了
DESCRIPTION = "gpio ctrl libs"
SECTION = "libs"
PV = "3"
PR = "0"
PN = "gpio_ctrl"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
SRC_URI = " \
file://gpio_ctrl.c \
file://gpio_ctrl.h \
file://makefile \
"
S = "${WORKDIR}"
do_compile () {
make
}
do_install () {
install -d ${D}/usr/lib
cp ${WORKDIR}/libgpioctrl.so ${WORKDIR}/libgpioctrl.so.${PR}
install -m 0755 ${WORKDIR}/libgpioctrl.so ${D}/usr/lib
install -m 0755 ${WORKDIR}/libgpioctrl.so.${PR} ${D}/usr/lib
cd ${D}/usr/lib/
# ln -sf libgpioctrl.so.${PR} libgpioctrl.so
ln -sf libgpioctrl.so libgpioctrl.so.${PR}
install -d ${D}/usr/include
install -m 0644 ${WORKDIR}/gpio_ctrl.h ${D}/usr/include/
}
FILES_${PN} += "${libdir}/*.so"
FILES_${PN}-dbg += "${libdir}/.debug"
FILES_SOLIBSDEV = ""
INSANE_SKIP_${PN} = "dev-so"
QA Issue: gpio_ctrl: Files/directories were installed but not shipped in any package:
这个是需要在.bb配置文件中添加FILES_${PN} += "${libdir}/*.so"代码即可
添加一个新的配置文件夹之后,包含有bb配置菜单,执行bitbake gpio_ctrl,报ERROR: Nothing PROVIDES 'gpio_ctrl'
这时需要在bb配置菜单中添加:PN = "gpio_ctrl" 即可