Yocto / Poky: установить и использовать общую библиотеку .so на разных уровнях - PullRequest
0 голосов
/ 03 января 2019

Я пытаюсь научиться создавать собственные образы Linux с помощью Yocto, и я изо всех сил пытаюсь создать образ как с общей библиотекой, так и с программой, которая ее использует.

Я начал с этого урока и все прошло хорошо. Затем я безуспешно пытался отделить программу от библиотеки в двух разных слоях.

Я начал с кода библиотеки:

greetings.c

#include <stdio.h>
#include <string.h>
#include "greetings.h"
void get_greeting(char * buffer) {

    if(buffer == NULL) {
        return;
    }

    char greeting[] = "Hello world from the greetings lib\n";
    strcpy(buffer, greeting);
    return;
}

greetings.h

void get_greeting(char * buffer);

Makefile.am

AUTOMAKE_OPTIONS = foreign

lib_LTLIBRARIES = libgreetings.la
libgreetings_la_SOURCES = greetings.c

include_HEADERS = greetings.h
libgreetings_la_CFLAGS = -Wall -Werror -fPIC
libgreetings_la_LDFLAGS = -shared
ACLOCAL_AMFLAGS = -I m4

configure.ac

AC_INIT([Greetings lib], 1.0)
AM_INIT_AUTOMAKE
AC_PROG_CC
AC_CONFIG_MACRO_DIR([m4])
LT_INIT()
AC_CONFIG_FILES(Makefile)
AC_OUTPUT

Я добавил этот код в репозиторий git и создал слой «meta-greetings» с помощью layer.conf и файлов рецептов:

layer.conf

# We have a conf and classes directory, add to BBPATH
BBPATH .= ":${LAYERDIR}"

# We have recipes-* directories, add to BBFILES
BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \
            ${LAYERDIR}/recipes-*/*/*.bbappend"

BBFILE_COLLECTIONS += "meta-greetings"
BBFILE_PATTERN_meta-greetings = "^${LAYERDIR}/"
BBFILE_PRIORITY_meta-greetings = "6"

LAYERDEPENDS_meta-greetings = "core"
LAYERSERIES_COMPAT_meta-greetings = "thud"
IMAGE_INSTALL_append = " greetings"

рецепты-приветствие / приветствие / greetings_0.1.bb

SUMMARY = "bitbake-layers recipe"
DESCRIPTION = "Simple helloworld lib"
DEPENDS = ""
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://LICENSE;md5=96af5705d6f64a88e035781ef00e98a8"

KBRANCH = "master"
SRCREV = "1a908a8f8616af704ce71d693e88c6d4498f24c4"

SRC_URI = "git://bitbucket.org/Grifo/greetings_lib.git;branch=${KBRANCH};protocol=ssh"

S = "${WORKDIR}/git"

inherit autotools

Пока все хорошо, я добавил этот слой в свой файл bblayers и приступил к компиляции окончательного изображения. Я запускаю его в qemu и даже вижу файлы в / usr / lib:

enter image description here

Однако нет "libgreetings.so". Я не знаю, может ли это быть причиной проблемы (все еще для объяснения), но ранее упомянутое руководство получило аналогичные результаты, поэтому я продолжил.

После этого я сделал программу:

helloworld.c

#include <stdio.h>
#include "greetings.h"
int main(void) {
    char greeting[40];
    get_greeting(greeting);
    printf("Hello world!\n");
    printf("%s", greeting);
    return 0;
}

Makefile.am

AUTOMAKE_OPTIONS = foreign

bin_PROGRAMS = hello_world
hello_world_SOURCES = helloworld.c
hello_world_LDADD = $(libdir)/libgreetings.so
ACLOCAL_AMFLAGS = -I m4

configure.ac

AC_INIT([Hello world], 1.0)
AM_INIT_AUTOMAKE
AC_PROG_CC
AC_CONFIG_MACRO_DIR([m4])
AC_CONFIG_FILES(Makefile)
AC_OUTPUT

Добавил этот код в git и создал слой «meta-helloworld» с файлами:

layer.conf

# We have a conf and classes directory, add to BBPATH
BBPATH .= ":${LAYERDIR}"

# We have recipes-* directories, add to BBFILES
BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \
            ${LAYERDIR}/recipes-*/*/*.bbappend"

BBFILE_COLLECTIONS += "meta-helloworld"
BBFILE_PATTERN_meta-helloworld = "^${LAYERDIR}/"
BBFILE_PRIORITY_meta-helloworld = "7"

LAYERDEPENDS_meta-helloworld = "core meta-greetings"
LAYERSERIES_COMPAT_meta-helloworld = "thud"
IMAGE_INSTALL_append = " helloworld"

рецепты-HelloWorld / HelloWorld / helloworld_0.1.bb

SUMMARY = "bitbake-layers helloworld"
DESCRIPTION = "Simple helloworld program"

LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://LICENSE;md5=96af5705d6f64a88e035781ef00e98a8"

KBRANCH = "master"
SRCREV = "6a29425473286028e85e74003f2f57ecaf766354"

SRC_URI = "git://bitbucket.org/Grifo/hello_world.git;branch=${KBRANCH};protocol=ssh"

DEPENDS = "greetings"

S = "${WORKDIR}/git"

inherit autotools

После всего этого я снова запекла окончательное изображение, но получила следующую ошибку:

(...)
Sstate summary: Wanted 7 Found 0 Missed 7 Current 737 (0% match, 99% complete)
NOTE: Executing SetScene Tasks
NOTE: Executing RunQueue Tasks
ERROR: helloworld-0.1-r0 do_compile: oe_runmake failed
ERROR: helloworld-0.1-r0 do_compile: Function failed: do_compile (log file is located at /var/tmp/workspaces/grifo/poky/build/tmp/work/armv5e-poky-linux-gnueabi/helloworld/0.1-r0/temp/log.do_compile.12040)
ERROR: Logfile of failure stored in: /var/tmp/workspaces/grifo/poky/build/tmp/work/armv5e-poky-linux-gnueabi/helloworld/0.1-r0/temp/log.do_compile.12040
Log data follows:
| DEBUG: SITE files ['endian-little', 'bit-32', 'arm-common', 'arm-32', 'common-linux', 'common-glibc', 'arm-linux', 'arm-linux-gnueabi', 'common']
| DEBUG: Executing shell function do_compile
| NOTE: make -j 8
| make: *** No rule to make target `/usr/lib/libgreetings.so', needed by `hello_world'.  Stop.
| ERROR: oe_runmake failed
| WARNING: /var/tmp/workspaces/grifo/poky/build/tmp/work/armv5e-poky-linux-gnueabi/helloworld/0.1-r0/temp/run.do_compile.12040:1 exit 1 from 'exit 1'
| ERROR: Function failed: do_compile (log file is located at /var/tmp/workspaces/grifo/poky/build/tmp/work/armv5e-poky-linux-gnueabi/helloworld/0.1-r0/temp/log.do_compile.12040)
ERROR: Task (/var/tmp/workspaces/grifo/poky/meta-helloworld/recipes-helloworld/helloworld/helloworld_0.1.bb:do_compile) failed with exit code '1'
NOTE: Tasks Summary: Attempted 1966 tasks of which 1965 didn't need to be rerun and 1 failed.

Summary: 1 task failed:
  /var/tmp/workspaces/grifo/poky/meta-helloworld/recipes-helloworld/helloworld/helloworld_0.1.bb:do_compile
Summary: There was 1 WARNING message shown.
Summary: There were 2 ERROR messages shown, returning a non-zero exit code.

Я прошу прощения за действительно длинный вопрос, но я чувствовал, что мне нужно дать все подробности, так как я не знаю, происходит ли проблема из моего рецепта или моих файлов автоинструментов.

Прежде чем я собрал рецепты и скомпилировал их с помощью yocto, я сначала скомпилировал и запустил его на своем хост-компьютере с помощью оболочки, и все работало нормально. Я скомпилировал и make install библиотеку приветствий (/ usr / local / lib), а затем скомпилировал программу helloworld, которая работает без проблем.

Я знаю, что, вероятно, я мог бы легко сделать это на одном и том же слое, однако я пытаюсь сделать это на разных слоях для имитации разных проектов. Еще одно мое требование - использовать автоинструмент вместо cmake.

Заранее спасибо,

Грифо

EDIT:

Я получил это на работу! Спасибо Александру Канавину за то, что он указал мне правильное направление. Мне просто нужно было изменить hello_world_LDADD = $(libdir)/libgreetings.so на hello_world_LDADD = -lgreetings в Makefile.am моего helloworld.

1 Ответ

0 голосов
/ 04 января 2019

libgreetings.so - файл, необходимый только для разработки, и поэтому он не устанавливается в образ (если только вы не установили пакет libgreetings-dev - вот где он был).

Во время кросс-компиляции,Вы обычно указываете библиотеки для ссылки следующим образом: -lgreetings

Так что измените hello_world_LDADD = $(libdir)/libgreetings.so на hello_world_LDADD = -lgreetings.

Я бы начал с этого.Как правило, вы не должны жестко их кодировать в make-файле, а просто «обнаружить» и проверить библиотеку в файле configure.ac (например, используя pkg-config, предполагая, что ваша библиотека устанавливает соответствующий файл .pc), и установить соответствующий компилятор ифлаги компоновщика:

PKG_CHECK_MODULES (GREETINGS, [приветствия])

Затем в Makefile.am:

hello_world_LDADD = $ (GREETINGS_LIBS)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...