如何在sdk中获取静态库?

BЈо*_*вић 3 sdk static-libraries yocto

搜索如何在 SDK 中包含静态库的每个人,一定要阅读2014 年的这个线程。我尝试了他们的建议,但没有奏效。

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

DISABLE_STATIC = ""
Run Code Online (Sandbox Code Playgroud)

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

那么,我究竟需要做什么才能在 SDK 中获取静态库和头文件?


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


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

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
Run Code Online (Sandbox Code Playgroud)

示例-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"
Run Code Online (Sandbox Code Playgroud)

库.c:

int foo()
{
    return 42;
}
Run Code Online (Sandbox Code Playgroud)

库.h:

int foo();
Run Code Online (Sandbox Code Playgroud)

生成文件:

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)
Run Code Online (Sandbox Code Playgroud)

究竟如何修改recipe,才能得到SDK中的静态库?

And*_*ers 5

按照您添加的示例。

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

TOOLCHAIN_TARGET_TASK += "example-staticlib-staticdev"
Run Code Online (Sandbox Code Playgroud)

应该为你工作。这会给你.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.