Search code examples
cmakeyocto

Link correct version of shared library from Yocto recipe


I have a versioned library, mylib installed by, mylib.bb:

...
TARGET_CC_ARCH += "${LDFLAGS}"

do_compile() {
    ${CC} -c -o mylib.o ${S}/mylib.c
    ${CC} -shared -o libmylib.so mylib.o
    ${AR} rcs libmylib.a mylib.o
}

do_install() {
    install -Dm0644 libmylib.so ${D}${libdir}/libmylib.so.0.1
    ln -srf ${D}${libdir}/libmylib.so.0.1 ${D}${libdir}/libmylib.so.0
    ln -srf ${D}${libdir}/libmylib.so.0 ${D}${libdir}/libmylib.so
    install -Dm0644 libmylib.a ${D}${libdir}/libmylib.a
    install -Dm0644 ${S}/mylib.h ${D}${includedir}/mylib.h
}

FILES_${PN} = "\
    ${libdir}/libmylib.a \
    ${libdir}/libmylib.so.0 \
    ${libdir}/libmylib.so.0.1 \
"

This seems to install files in the correct packages:

├── packages-split
│   ├── mylib
│   │   └── usr
│   │       └── lib
│   │           ├── libmylib.so.0 -> libmylib.so.0.1
│   │           └── libmylib.so.0.1
│   ├── mylib-dbg
│   │   └── usr
│   │       └── lib
│   ├── mylib-dev
│   │   └── usr
│   │       ├── include
│   │       │   └── mylib.h
│   │       └── lib
│   │           └── libmylib.so -> libmylib.so.0.1
│   ├── mylib-doc
│   ├── mylib-locale
│   ├── mylib-src
│   └── mylib-staticdev
│       └── usr
│           └── lib
│               └── libmylib.a

I now have another application build by another recipe, myapp.bb:

...

DEPENDS = " \
  qtbase \
  mylib \
"

RDEPENDS_${PN} = " \
  qtbase \
  mylib \
"

...

inherit cmake_qt5

There exists a target with the following:

...
find_library(MYLIB_LIB mylib)
...
target_link_libraries(
    myapp
    PRIVATE
        Qt5::Core
        ${MYLIB_LIBS}
)

When I run bitbake myapp, I get the following QA error:

ERROR: myapp-1.0+gitAUTOINC+11b975a273-r0 do_package_qa: QA Issue: /usr/bin/myapp contained in package myapp requires libmylib.so()(64bit), but no providers found in RDEPENDS_myapp? [file-rdeps]
ERROR: myapp-1.0+gitAUTOINC+11b975a273-r0 do_package_qa: QA run found fatal errors. Please consider fixing them.
ERROR: Logfile of failure stored in: /project/build/tmp/work/aarch64-poky-linux/myapp/1.0+gitAUTOINC+11b975a273-r0/temp/log.do_package_qa.630508
ERROR: Task (/project/sources/meta-b9/meta-b9/recipes-b9/myapp/myapp_0.bb:do_package_qa) failed with exit code '1'

When I look at the compile step I see the flag -lmylib where I would expect the path to mylib.so.1. Why is this and what can I do to fix it so I can build myapp with my recipe?


Solution

  • The linker flag -soname must be specified. When building the library. This can be done indirectly through the compiler by adding the option -Wl,-soname,...

    So the do_compile step would look something like:

    do_compile() {
        ${CC} -c -o mylib.o ${S}/mylib.c
        ${CC} -shared -Wl,-soname,libmylib.so.0.1 -o libmylib.so mylib.o
        ${AR} rcs libmylib.a mylib.o
    }