Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get static library in sdk?

Everyone who searched how to include a static library in SDK, surely read this thread from 2014. I tried what they suggested, but that didn't work.

Reading the yocto mega manual version 2.1 (yocto morty), I found in chapter 5.9.12. (Poky Reference Distribution Changes), that they added DISABLE_STATIC variable, to disable generation of static libraries. I tried adding this to my recipe, and it didn't enable adding static library to SDK:

DISABLE_STATIC = ""

I can see the library in the sysroot when building the image. But it is not getting in the SDK.

So, what exactly do I need to do to get a static library and the headers in SDK?


What worked is adding the staticdev package to ´IMAGE_INSTALL´ in local.conf, but I don't want to have to do that.


I created an example recipe, which demonstrates my problem. The directory structure is like this:

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();

Makefile:

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)

How exactly to modify the recipe, in order to get the static library in the SDK?

like image 774
BЈовић Avatar asked Oct 23 '25 20:10

BЈовић


1 Answers

Following your added example.

Adding the following line to your image recipe (or to an .bbappend, eg core-image-minimal.bbappend)

TOOLCHAIN_TARGET_TASK += "example-staticlib-staticdev"

should work for you. That will give you the .a file in the SDK, after running bitbake core-image-minimal -c populate_sdk. (Again assuming that the image used is core-image-minimal).

That your experiment to add the .a file to ${PN}-dev didn't work, is duet to the order of how files are put into packages. The order is ${PN}-dbg ${PN}-staticdev ${PN}-dev ${PN}-doc ${PN}-locale ${PACKAGE_BEFORE_PN} ${PN}. Thus, the .a file will, regardless, be put into ${PN}-staticdev, as that packages is handled prior to {PN}-dev.

Note, you add this line, TOOLCHAIN_TARGET_TASK += "example-staticlib-staticdev" to your image recipe, thus, you need to write the package name instead of PN.

like image 79
Anders Avatar answered Oct 27 '25 02:10

Anders