如何在sdk中获取静态库?

时间:2017-03-28 11:54:22

标签: sdk static-libraries yocto

每个搜索过如何在SDK中包含静态库的人都一定要阅读this thread from 2014。我尝试了他们的建议,但那没用。

阅读yocto mega手册版本2.1(yocto morty),我在第5.9.12章中找到了。 (Poky Reference Distribution Changes),他们添加了DISABLE_STATIC变量,以禁用静态库的生成。我尝试将其添加到我的配方中,但它没有启用向SDK添加静态库:

DISABLE_STATIC = ""

构建映像时,我可以在sysroot中看到库。但它没有进入SDK。

那么,我需要做些什么才能在SDK中获得静态库和标题?

local.conf中将staticdev包添加到'IMAGE_INSTALL'是有效的,但我不想这样做。

我创建了一个示例配方,它演示了我的问题。目录结构如下:

example-staticlib/
example-staticlib/example-staticlib_0.1.bb
example-staticlib/files/
example-staticlib/files/lib.c
example-staticlib/files/lib.h
example-staticlib/files/Makefile

example-staticlib_0.1.bb:

DESCRIPTION = "example stared library"
LICENSE = "LGPLv2"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/LGPL-2.0;md5=9427b8ccf5cf3df47c29110424c9641a"

SRC_URI = "file://lib.c \
           file://lib.h \
           file://Makefile"

PR = "r0"
S = "${WORKDIR}"

ALLOW_EMPTY_${PN} = "1"

do_install () {
    oe_runmake install DEST=${D}
}

TOOLCHAIN_TARGET_TASK += "example-staticlib-dev"
TOOLCHAIN_TARGET_TASK += "example-staticlib-staticdev"

lib.c:

int foo()
{
    return 42;
}

lib.h:

int foo();

生成文件:

TARGET=libexample.a

all:$(TARGET)

install :
    @install -d $(DEST)/usr/lib/
    @install -m 0644 $(TARGET) $(DEST)/usr/lib/
    @install -d $(DEST)/usr/include/
    @install -m 0644 lib.h $(DEST)/usr/include/

$(TARGET) : lib.c
    $(CC) -c lib.c -o lib.o
    $(AR) rcs $@ lib.o 

clean:
    rm -rf lib.o $(TARGET)

如何修改配方,以便在SDK中获取静态库?

2 个答案:

答案 0 :(得分:3)

按照您添加的示例。

将以下行添加到图像配方(或.bbappend,例如core-image-minimal.bbappend

TOOLCHAIN_TARGET_TASK += "example-staticlib-staticdev"

应该适合你。在运行.a之后,这将为您提供SDK中的bitbake core-image-minimal -c populate_sdk文件。 (再次假设使用的图像是core-image-minimal)。

您将.a文件添加到${PN}-dev的实验不起作用,这与文件放入包中的顺序有关。订单为${PN}-dbg ${PN}-staticdev ${PN}-dev ${PN}-doc ${PN}-locale ${PACKAGE_BEFORE_PN} ${PN}。因此,.a文件将被放入${PN}-staticdev,因为这些包在{PN}-dev之前处理。

注意,您将此行TOOLCHAIN_TARGET_TASK += "example-staticlib-staticdev"添加到图像配方中,因此,您需要编写包名而不是PN

答案 1 :(得分:0)

我尝试了一种无需编辑图像配方的方法。

example-staticlib_0.1.bb:

在do_install之后。我没有使用 TOOLCHAIN_TARGET_TASK

FILES _ $ {PN} -staticdev + =“ $ {libdir} /libexample.a”

RDEPENDS _ $ {PN} -dev + =“ $ {PN} -staticdev”

BBCLASSEXTEND =“本地nativesdk”